{"version":3,"file":"firebase-storage.js","sources":["../storage/dist/index.esm.js"],"sourcesContent":["import firebase from '@firebase/app';\n\n/**\r\n * @license\r\n * Copyright 2017 Google Inc.\r\n *\r\n * Licensed under the Apache License, Version 2.0 (the \"License\");\r\n * you may not use this file except in compliance with the License.\r\n * You may obtain a copy of the License at\r\n *\r\n * http://www.apache.org/licenses/LICENSE-2.0\r\n *\r\n * Unless required by applicable law or agreed to in writing, software\r\n * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n * See the License for the specific language governing permissions and\r\n * limitations under the License.\r\n */\r\n/**\r\n * @fileoverview Constants used in the Firebase Storage library.\r\n */\r\n/**\r\n * Domain and scheme for API calls.\r\n */\r\nvar domainBase = 'https://firebasestorage.googleapis.com';\r\n/**\r\n * Domain and scheme for object downloads.\r\n */\r\nvar downloadBase = 'https://firebasestorage.googleapis.com';\r\n/**\r\n * Base URL for non-upload calls to the API.\r\n */\r\nvar apiBaseUrl = '/v0';\r\n/**\r\n * Base URL for upload calls to the API.\r\n */\r\nvar apiUploadBaseUrl = '/v0';\r\nvar configOption = 'storageBucket';\r\n/**\r\n * 2 minutes\r\n */\r\nvar defaultMaxOperationRetryTime = 2 * 60 * 1000;\r\n/**\r\n * 10 minutes\r\n */\r\nvar defaultMaxUploadRetryTime = 10 * 60 * 100;\r\n/**\r\n * This is the value of Number.MIN_SAFE_INTEGER, which is not well supported\r\n * enough for us to use it directly.\r\n */\r\nvar minSafeInteger = -9007199254740991;\n\n/**\r\n * @license\r\n * Copyright 2017 Google Inc.\r\n *\r\n * Licensed under the Apache License, Version 2.0 (the \"License\");\r\n * you may not use this file except in compliance with the License.\r\n * You may obtain a copy of the License at\r\n *\r\n * http://www.apache.org/licenses/LICENSE-2.0\r\n *\r\n * Unless required by applicable law or agreed to in writing, software\r\n * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n * See the License for the specific language governing permissions and\r\n * limitations under the License.\r\n */\r\nvar FirebaseStorageError = /** @class */ (function () {\r\n function FirebaseStorageError(code, message) {\r\n this.code_ = prependCode(code);\r\n this.message_ = 'Firebase Storage: ' + message;\r\n this.serverResponse_ = null;\r\n this.name_ = 'FirebaseError';\r\n }\r\n FirebaseStorageError.prototype.codeProp = function () {\r\n return this.code;\r\n };\r\n FirebaseStorageError.prototype.codeEquals = function (code) {\r\n return prependCode(code) === this.codeProp();\r\n };\r\n FirebaseStorageError.prototype.serverResponseProp = function () {\r\n return this.serverResponse_;\r\n };\r\n FirebaseStorageError.prototype.setServerResponseProp = function (serverResponse) {\r\n this.serverResponse_ = serverResponse;\r\n };\r\n Object.defineProperty(FirebaseStorageError.prototype, \"name\", {\r\n get: function () {\r\n return this.name_;\r\n },\r\n enumerable: true,\r\n configurable: true\r\n });\r\n Object.defineProperty(FirebaseStorageError.prototype, \"code\", {\r\n get: function () {\r\n return this.code_;\r\n },\r\n enumerable: true,\r\n configurable: true\r\n });\r\n Object.defineProperty(FirebaseStorageError.prototype, \"message\", {\r\n get: function () {\r\n return this.message_;\r\n },\r\n enumerable: true,\r\n configurable: true\r\n });\r\n Object.defineProperty(FirebaseStorageError.prototype, \"serverResponse\", {\r\n get: function () {\r\n return this.serverResponse_;\r\n },\r\n enumerable: true,\r\n configurable: true\r\n });\r\n return FirebaseStorageError;\r\n}());\r\nvar Code = {\r\n // Shared between all platforms\r\n UNKNOWN: 'unknown',\r\n OBJECT_NOT_FOUND: 'object-not-found',\r\n BUCKET_NOT_FOUND: 'bucket-not-found',\r\n PROJECT_NOT_FOUND: 'project-not-found',\r\n QUOTA_EXCEEDED: 'quota-exceeded',\r\n UNAUTHENTICATED: 'unauthenticated',\r\n UNAUTHORIZED: 'unauthorized',\r\n RETRY_LIMIT_EXCEEDED: 'retry-limit-exceeded',\r\n INVALID_CHECKSUM: 'invalid-checksum',\r\n CANCELED: 'canceled',\r\n // JS specific\r\n INVALID_EVENT_NAME: 'invalid-event-name',\r\n INVALID_URL: 'invalid-url',\r\n INVALID_DEFAULT_BUCKET: 'invalid-default-bucket',\r\n NO_DEFAULT_BUCKET: 'no-default-bucket',\r\n CANNOT_SLICE_BLOB: 'cannot-slice-blob',\r\n SERVER_FILE_WRONG_SIZE: 'server-file-wrong-size',\r\n NO_DOWNLOAD_URL: 'no-download-url',\r\n INVALID_ARGUMENT: 'invalid-argument',\r\n INVALID_ARGUMENT_COUNT: 'invalid-argument-count',\r\n APP_DELETED: 'app-deleted',\r\n INVALID_ROOT_OPERATION: 'invalid-root-operation',\r\n INVALID_FORMAT: 'invalid-format',\r\n INTERNAL_ERROR: 'internal-error'\r\n};\r\nfunction prependCode(code) {\r\n return 'storage/' + code;\r\n}\r\nfunction unknown() {\r\n var message = 'An unknown error occurred, please check the error payload for ' +\r\n 'server response.';\r\n return new FirebaseStorageError(Code.UNKNOWN, message);\r\n}\r\nfunction objectNotFound(path) {\r\n return new FirebaseStorageError(Code.OBJECT_NOT_FOUND, \"Object '\" + path + \"' does not exist.\");\r\n}\r\nfunction quotaExceeded(bucket) {\r\n return new FirebaseStorageError(Code.QUOTA_EXCEEDED, \"Quota for bucket '\" +\r\n bucket +\r\n \"' exceeded, please view quota on \" +\r\n 'https://firebase.google.com/pricing/.');\r\n}\r\nfunction unauthenticated() {\r\n var message = 'User is not authenticated, please authenticate using Firebase ' +\r\n 'Authentication and try again.';\r\n return new FirebaseStorageError(Code.UNAUTHENTICATED, message);\r\n}\r\nfunction unauthorized(path) {\r\n return new FirebaseStorageError(Code.UNAUTHORIZED, \"User does not have permission to access '\" + path + \"'.\");\r\n}\r\nfunction retryLimitExceeded() {\r\n return new FirebaseStorageError(Code.RETRY_LIMIT_EXCEEDED, 'Max retry time for operation exceeded, please try again.');\r\n}\r\nfunction canceled() {\r\n return new FirebaseStorageError(Code.CANCELED, 'User canceled the upload/download.');\r\n}\r\nfunction invalidUrl(url) {\r\n return new FirebaseStorageError(Code.INVALID_URL, \"Invalid URL '\" + url + \"'.\");\r\n}\r\nfunction invalidDefaultBucket(bucket) {\r\n return new FirebaseStorageError(Code.INVALID_DEFAULT_BUCKET, \"Invalid default bucket '\" + bucket + \"'.\");\r\n}\r\nfunction cannotSliceBlob() {\r\n return new FirebaseStorageError(Code.CANNOT_SLICE_BLOB, 'Cannot slice blob for upload. Please retry the upload.');\r\n}\r\nfunction serverFileWrongSize() {\r\n return new FirebaseStorageError(Code.SERVER_FILE_WRONG_SIZE, 'Server recorded incorrect upload file size, please retry the upload.');\r\n}\r\nfunction noDownloadURL() {\r\n return new FirebaseStorageError(Code.NO_DOWNLOAD_URL, 'The given file does not have any download URLs.');\r\n}\r\nfunction invalidArgument(index, fnName, message) {\r\n return new FirebaseStorageError(Code.INVALID_ARGUMENT, 'Invalid argument in `' + fnName + '` at index ' + index + ': ' + message);\r\n}\r\nfunction invalidArgumentCount(argMin, argMax, fnName, real) {\r\n var countPart;\r\n var plural;\r\n if (argMin === argMax) {\r\n countPart = argMin;\r\n plural = argMin === 1 ? 'argument' : 'arguments';\r\n }\r\n else {\r\n countPart = 'between ' + argMin + ' and ' + argMax;\r\n plural = 'arguments';\r\n }\r\n return new FirebaseStorageError(Code.INVALID_ARGUMENT_COUNT, 'Invalid argument count in `' +\r\n fnName +\r\n '`: Expected ' +\r\n countPart +\r\n ' ' +\r\n plural +\r\n ', received ' +\r\n real +\r\n '.');\r\n}\r\nfunction appDeleted() {\r\n return new FirebaseStorageError(Code.APP_DELETED, 'The Firebase app was deleted.');\r\n}\r\n/**\r\n * @param name The name of the operation that was invalid.\r\n */\r\nfunction invalidRootOperation(name) {\r\n return new FirebaseStorageError(Code.INVALID_ROOT_OPERATION, \"The operation '\" +\r\n name +\r\n \"' cannot be performed on a root reference, create a non-root \" +\r\n \"reference using child, such as .child('file.png').\");\r\n}\r\n/**\r\n * @param format The format that was not valid.\r\n * @param message A message describing the format violation.\r\n */\r\nfunction invalidFormat(format, message) {\r\n return new FirebaseStorageError(Code.INVALID_FORMAT, \"String does not match format '\" + format + \"': \" + message);\r\n}\r\n/**\r\n * @param message A message describing the internal error.\r\n */\r\nfunction internalError(message) {\r\n throw new FirebaseStorageError(Code.INTERNAL_ERROR, 'Internal error: ' + message);\r\n}\n\n/**\r\n * @license\r\n * Copyright 2017 Google Inc.\r\n *\r\n * Licensed under the Apache License, Version 2.0 (the \"License\");\r\n * you may not use this file except in compliance with the License.\r\n * You may obtain a copy of the License at\r\n *\r\n * http://www.apache.org/licenses/LICENSE-2.0\r\n *\r\n * Unless required by applicable law or agreed to in writing, software\r\n * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n * See the License for the specific language governing permissions and\r\n * limitations under the License.\r\n */\r\nvar StringFormat = {\r\n RAW: 'raw',\r\n BASE64: 'base64',\r\n BASE64URL: 'base64url',\r\n DATA_URL: 'data_url'\r\n};\r\nfunction formatValidator(stringFormat) {\r\n switch (stringFormat) {\r\n case StringFormat.RAW:\r\n case StringFormat.BASE64:\r\n case StringFormat.BASE64URL:\r\n case StringFormat.DATA_URL:\r\n return;\r\n default:\r\n throw 'Expected one of the event types: [' +\r\n StringFormat.RAW +\r\n ', ' +\r\n StringFormat.BASE64 +\r\n ', ' +\r\n StringFormat.BASE64URL +\r\n ', ' +\r\n StringFormat.DATA_URL +\r\n '].';\r\n }\r\n}\r\n/**\r\n * @struct\r\n */\r\nvar StringData = /** @class */ (function () {\r\n function StringData(data, opt_contentType) {\r\n this.data = data;\r\n this.contentType = opt_contentType || null;\r\n }\r\n return StringData;\r\n}());\r\nfunction dataFromString(format, string) {\r\n switch (format) {\r\n case StringFormat.RAW:\r\n return new StringData(utf8Bytes_(string));\r\n case StringFormat.BASE64:\r\n case StringFormat.BASE64URL:\r\n return new StringData(base64Bytes_(format, string));\r\n case StringFormat.DATA_URL:\r\n return new StringData(dataURLBytes_(string), dataURLContentType_(string));\r\n }\r\n // assert(false);\r\n throw unknown();\r\n}\r\nfunction utf8Bytes_(string) {\r\n var b = [];\r\n for (var i = 0; i < string.length; i++) {\r\n var c = string.charCodeAt(i);\r\n if (c <= 127) {\r\n b.push(c);\r\n }\r\n else {\r\n if (c <= 2047) {\r\n b.push(192 | (c >> 6), 128 | (c & 63));\r\n }\r\n else {\r\n if ((c & 64512) == 55296) {\r\n // The start of a surrogate pair.\r\n var valid = i < string.length - 1 &&\r\n (string.charCodeAt(i + 1) & 64512) == 56320;\r\n if (!valid) {\r\n // The second surrogate wasn't there.\r\n b.push(239, 191, 189);\r\n }\r\n else {\r\n var hi = c;\r\n var lo = string.charCodeAt(++i);\r\n c = 65536 | ((hi & 1023) << 10) | (lo & 1023);\r\n b.push(240 | (c >> 18), 128 | ((c >> 12) & 63), 128 | ((c >> 6) & 63), 128 | (c & 63));\r\n }\r\n }\r\n else {\r\n if ((c & 64512) == 56320) {\r\n // Invalid low surrogate.\r\n b.push(239, 191, 189);\r\n }\r\n else {\r\n b.push(224 | (c >> 12), 128 | ((c >> 6) & 63), 128 | (c & 63));\r\n }\r\n }\r\n }\r\n }\r\n }\r\n return new Uint8Array(b);\r\n}\r\nfunction percentEncodedBytes_(string) {\r\n var decoded;\r\n try {\r\n decoded = decodeURIComponent(string);\r\n }\r\n catch (e) {\r\n throw invalidFormat(StringFormat.DATA_URL, 'Malformed data URL.');\r\n }\r\n return utf8Bytes_(decoded);\r\n}\r\nfunction base64Bytes_(format, string) {\r\n switch (format) {\r\n case StringFormat.BASE64: {\r\n var hasMinus = string.indexOf('-') !== -1;\r\n var hasUnder = string.indexOf('_') !== -1;\r\n if (hasMinus || hasUnder) {\r\n var invalidChar = hasMinus ? '-' : '_';\r\n throw invalidFormat(format, \"Invalid character '\" +\r\n invalidChar +\r\n \"' found: is it base64url encoded?\");\r\n }\r\n break;\r\n }\r\n case StringFormat.BASE64URL: {\r\n var hasPlus = string.indexOf('+') !== -1;\r\n var hasSlash = string.indexOf('/') !== -1;\r\n if (hasPlus || hasSlash) {\r\n var invalidChar = hasPlus ? '+' : '/';\r\n throw invalidFormat(format, \"Invalid character '\" + invalidChar + \"' found: is it base64 encoded?\");\r\n }\r\n string = string.replace(/-/g, '+').replace(/_/g, '/');\r\n break;\r\n }\r\n }\r\n var bytes;\r\n try {\r\n bytes = atob(string);\r\n }\r\n catch (e) {\r\n throw invalidFormat(format, 'Invalid character found');\r\n }\r\n var array = new Uint8Array(bytes.length);\r\n for (var i = 0; i < bytes.length; i++) {\r\n array[i] = bytes.charCodeAt(i);\r\n }\r\n return array;\r\n}\r\n/**\r\n * @struct\r\n */\r\nvar DataURLParts = /** @class */ (function () {\r\n function DataURLParts(dataURL) {\r\n this.base64 = false;\r\n this.contentType = null;\r\n var matches = dataURL.match(/^data:([^,]+)?,/);\r\n if (matches === null) {\r\n throw invalidFormat(StringFormat.DATA_URL, \"Must be formatted 'data:[][;base64],\");\r\n }\r\n var middle = matches[1] || null;\r\n if (middle != null) {\r\n this.base64 = endsWith(middle, ';base64');\r\n this.contentType = this.base64\r\n ? middle.substring(0, middle.length - ';base64'.length)\r\n : middle;\r\n }\r\n this.rest = dataURL.substring(dataURL.indexOf(',') + 1);\r\n }\r\n return DataURLParts;\r\n}());\r\nfunction dataURLBytes_(string) {\r\n var parts = new DataURLParts(string);\r\n if (parts.base64) {\r\n return base64Bytes_(StringFormat.BASE64, parts.rest);\r\n }\r\n else {\r\n return percentEncodedBytes_(parts.rest);\r\n }\r\n}\r\nfunction dataURLContentType_(string) {\r\n var parts = new DataURLParts(string);\r\n return parts.contentType;\r\n}\r\nfunction endsWith(s, end) {\r\n var longEnough = s.length >= end.length;\r\n if (!longEnough) {\r\n return false;\r\n }\r\n return s.substring(s.length - end.length) === end;\r\n}\n\n/**\r\n * @license\r\n * Copyright 2017 Google Inc.\r\n *\r\n * Licensed under the Apache License, Version 2.0 (the \"License\");\r\n * you may not use this file except in compliance with the License.\r\n * You may obtain a copy of the License at\r\n *\r\n * http://www.apache.org/licenses/LICENSE-2.0\r\n *\r\n * Unless required by applicable law or agreed to in writing, software\r\n * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n * See the License for the specific language governing permissions and\r\n * limitations under the License.\r\n */\r\nvar TaskEvent = {\r\n /** Triggered whenever the task changes or progress is updated. */\r\n STATE_CHANGED: 'state_changed'\r\n};\r\nvar InternalTaskState = {\r\n RUNNING: 'running',\r\n PAUSING: 'pausing',\r\n PAUSED: 'paused',\r\n SUCCESS: 'success',\r\n CANCELING: 'canceling',\r\n CANCELED: 'canceled',\r\n ERROR: 'error'\r\n};\r\nvar TaskState = {\r\n /** The task is currently transferring data. */\r\n RUNNING: 'running',\r\n /** The task was paused by the user. */\r\n PAUSED: 'paused',\r\n /** The task completed successfully. */\r\n SUCCESS: 'success',\r\n /** The task was canceled. */\r\n CANCELED: 'canceled',\r\n /** The task failed with an error. */\r\n ERROR: 'error'\r\n};\r\nfunction taskStateFromInternalTaskState(state) {\r\n switch (state) {\r\n case InternalTaskState.RUNNING:\r\n case InternalTaskState.PAUSING:\r\n case InternalTaskState.CANCELING:\r\n return TaskState.RUNNING;\r\n case InternalTaskState.PAUSED:\r\n return TaskState.PAUSED;\r\n case InternalTaskState.SUCCESS:\r\n return TaskState.SUCCESS;\r\n case InternalTaskState.CANCELED:\r\n return TaskState.CANCELED;\r\n case InternalTaskState.ERROR:\r\n return TaskState.ERROR;\r\n default:\r\n // TODO(andysoto): assert(false);\r\n return TaskState.ERROR;\r\n }\r\n}\n\n/**\r\n * @license\r\n * Copyright 2017 Google Inc.\r\n *\r\n * Licensed under the Apache License, Version 2.0 (the \"License\");\r\n * you may not use this file except in compliance with the License.\r\n * You may obtain a copy of the License at\r\n *\r\n * http://www.apache.org/licenses/LICENSE-2.0\r\n *\r\n * Unless required by applicable law or agreed to in writing, software\r\n * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n * See the License for the specific language governing permissions and\r\n * limitations under the License.\r\n */\r\n/**\r\n * @fileoverview Contains methods for working with objects.\r\n */\r\nfunction contains(obj, prop) {\r\n return Object.prototype.hasOwnProperty.call(obj, prop);\r\n}\r\nfunction forEach(obj, f) {\r\n for (var key in obj) {\r\n if (contains(obj, key)) {\r\n f(key, obj[key]);\r\n }\r\n }\r\n}\r\nfunction clone(obj) {\r\n if (obj == null) {\r\n return {};\r\n }\r\n var c = {};\r\n forEach(obj, function (key, val) {\r\n c[key] = val;\r\n });\r\n return c;\r\n}\n\n/**\r\n * @license\r\n * Copyright 2017 Google Inc.\r\n *\r\n * Licensed under the Apache License, Version 2.0 (the \"License\");\r\n * you may not use this file except in compliance with the License.\r\n * You may obtain a copy of the License at\r\n *\r\n * http://www.apache.org/licenses/LICENSE-2.0\r\n *\r\n * Unless required by applicable law or agreed to in writing, software\r\n * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n * See the License for the specific language governing permissions and\r\n * limitations under the License.\r\n */\r\n/**\r\n * @fileoverview Implements the promise abstraction interface for external\r\n * (public SDK) packaging, which just passes through to the firebase-app impl.\r\n */\r\n/**\r\n * @template T\r\n * @param {function((function(T): void),\r\n * (function(!Error): void))} resolver\r\n */\r\nfunction make(resolver) {\r\n return new Promise(resolver);\r\n}\r\n/**\r\n * @template T\r\n */\r\nfunction resolve(value) {\r\n return Promise.resolve(value);\r\n}\r\nfunction reject(error) {\r\n return Promise.reject(error);\r\n}\n\n/**\r\n * @license\r\n * Copyright 2017 Google Inc.\r\n *\r\n * Licensed under the Apache License, Version 2.0 (the \"License\");\r\n * you may not use this file except in compliance with the License.\r\n * You may obtain a copy of the License at\r\n *\r\n * http://www.apache.org/licenses/LICENSE-2.0\r\n *\r\n * Unless required by applicable law or agreed to in writing, software\r\n * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n * See the License for the specific language governing permissions and\r\n * limitations under the License.\r\n */\r\n/**\r\n * @return False if the object is undefined or null, true otherwise.\r\n */\r\nfunction isDef(p) {\r\n return p != null;\r\n}\r\nfunction isJustDef(p) {\r\n return p !== void 0;\r\n}\r\nfunction isFunction(p) {\r\n return typeof p === 'function';\r\n}\r\nfunction isObject(p) {\r\n return typeof p === 'object';\r\n}\r\nfunction isNonNullObject(p) {\r\n return isObject(p) && p !== null;\r\n}\r\nfunction isNonArrayObject(p) {\r\n return isObject(p) && !Array.isArray(p);\r\n}\r\nfunction isString(p) {\r\n return typeof p === 'string' || p instanceof String;\r\n}\r\nfunction isNumber(p) {\r\n return typeof p === 'number' || p instanceof Number;\r\n}\r\nfunction isNativeBlob(p) {\r\n return isNativeBlobDefined() && p instanceof Blob;\r\n}\r\nfunction isNativeBlobDefined() {\r\n return typeof Blob !== 'undefined';\r\n}\n\n/**\r\n * @license\r\n * Copyright 2017 Google Inc.\r\n *\r\n * Licensed under the Apache License, Version 2.0 (the \"License\");\r\n * you may not use this file except in compliance with the License.\r\n * You may obtain a copy of the License at\r\n *\r\n * http://www.apache.org/licenses/LICENSE-2.0\r\n *\r\n * Unless required by applicable law or agreed to in writing, software\r\n * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n * See the License for the specific language governing permissions and\r\n * limitations under the License.\r\n */\r\n/**\r\n * @enum{number}\r\n */\r\nvar ErrorCode;\r\n(function (ErrorCode) {\r\n ErrorCode[ErrorCode[\"NO_ERROR\"] = 0] = \"NO_ERROR\";\r\n ErrorCode[ErrorCode[\"NETWORK_ERROR\"] = 1] = \"NETWORK_ERROR\";\r\n ErrorCode[ErrorCode[\"ABORT\"] = 2] = \"ABORT\";\r\n})(ErrorCode || (ErrorCode = {}));\n\n/**\r\n * @license\r\n * Copyright 2017 Google Inc.\r\n *\r\n * Licensed under the Apache License, Version 2.0 (the \"License\");\r\n * you may not use this file except in compliance with the License.\r\n * You may obtain a copy of the License at\r\n *\r\n * http://www.apache.org/licenses/LICENSE-2.0\r\n *\r\n * Unless required by applicable law or agreed to in writing, software\r\n * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n * See the License for the specific language governing permissions and\r\n * limitations under the License.\r\n */\r\n/**\r\n * We use this instead of goog.net.XhrIo because goog.net.XhrIo is hyuuuuge and\r\n * doesn't work in React Native on Android.\r\n */\r\nvar NetworkXhrIo = /** @class */ (function () {\r\n function NetworkXhrIo() {\r\n var _this = this;\r\n this.sent_ = false;\r\n this.xhr_ = new XMLHttpRequest();\r\n this.errorCode_ = ErrorCode.NO_ERROR;\r\n this.sendPromise_ = make(function (resolve, reject) {\r\n _this.xhr_.addEventListener('abort', function (event) {\r\n _this.errorCode_ = ErrorCode.ABORT;\r\n resolve(_this);\r\n });\r\n _this.xhr_.addEventListener('error', function (event) {\r\n _this.errorCode_ = ErrorCode.NETWORK_ERROR;\r\n resolve(_this);\r\n });\r\n _this.xhr_.addEventListener('load', function (event) {\r\n resolve(_this);\r\n });\r\n });\r\n }\r\n /**\r\n * @override\r\n */\r\n NetworkXhrIo.prototype.send = function (url, method, opt_body, opt_headers) {\r\n var _this = this;\r\n if (this.sent_) {\r\n throw internalError('cannot .send() more than once');\r\n }\r\n this.sent_ = true;\r\n this.xhr_.open(method, url, true);\r\n if (isDef(opt_headers)) {\r\n var headers = opt_headers;\r\n forEach(headers, function (key, val) {\r\n _this.xhr_.setRequestHeader(key, val.toString());\r\n });\r\n }\r\n if (isDef(opt_body)) {\r\n this.xhr_.send(opt_body);\r\n }\r\n else {\r\n this.xhr_.send();\r\n }\r\n return this.sendPromise_;\r\n };\r\n /**\r\n * @override\r\n */\r\n NetworkXhrIo.prototype.getErrorCode = function () {\r\n if (!this.sent_) {\r\n throw internalError('cannot .getErrorCode() before sending');\r\n }\r\n return this.errorCode_;\r\n };\r\n /**\r\n * @override\r\n */\r\n NetworkXhrIo.prototype.getStatus = function () {\r\n if (!this.sent_) {\r\n throw internalError('cannot .getStatus() before sending');\r\n }\r\n try {\r\n return this.xhr_.status;\r\n }\r\n catch (e) {\r\n return -1;\r\n }\r\n };\r\n /**\r\n * @override\r\n */\r\n NetworkXhrIo.prototype.getResponseText = function () {\r\n if (!this.sent_) {\r\n throw internalError('cannot .getResponseText() before sending');\r\n }\r\n return this.xhr_.responseText;\r\n };\r\n /**\r\n * Aborts the request.\r\n * @override\r\n */\r\n NetworkXhrIo.prototype.abort = function () {\r\n this.xhr_.abort();\r\n };\r\n /**\r\n * @override\r\n */\r\n NetworkXhrIo.prototype.getResponseHeader = function (header) {\r\n return this.xhr_.getResponseHeader(header);\r\n };\r\n /**\r\n * @override\r\n */\r\n NetworkXhrIo.prototype.addUploadProgressListener = function (listener) {\r\n if (isDef(this.xhr_.upload)) {\r\n this.xhr_.upload.addEventListener('progress', listener);\r\n }\r\n };\r\n /**\r\n * @override\r\n */\r\n NetworkXhrIo.prototype.removeUploadProgressListener = function (listener) {\r\n if (isDef(this.xhr_.upload)) {\r\n this.xhr_.upload.removeEventListener('progress', listener);\r\n }\r\n };\r\n return NetworkXhrIo;\r\n}());\n\n/**\r\n * @license\r\n * Copyright 2017 Google Inc.\r\n *\r\n * Licensed under the Apache License, Version 2.0 (the \"License\");\r\n * you may not use this file except in compliance with the License.\r\n * You may obtain a copy of the License at\r\n *\r\n * http://www.apache.org/licenses/LICENSE-2.0\r\n *\r\n * Unless required by applicable law or agreed to in writing, software\r\n * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n * See the License for the specific language governing permissions and\r\n * limitations under the License.\r\n */\r\n/**\r\n * Factory-like class for creating XhrIo instances.\r\n */\r\nvar XhrIoPool = /** @class */ (function () {\r\n function XhrIoPool() {\r\n }\r\n XhrIoPool.prototype.createXhrIo = function () {\r\n return new NetworkXhrIo();\r\n };\r\n return XhrIoPool;\r\n}());\n\n/**\r\n * @license\r\n * Copyright 2017 Google Inc.\r\n *\r\n * Licensed under the Apache License, Version 2.0 (the \"License\");\r\n * you may not use this file except in compliance with the License.\r\n * You may obtain a copy of the License at\r\n *\r\n * http://www.apache.org/licenses/LICENSE-2.0\r\n *\r\n * Unless required by applicable law or agreed to in writing, software\r\n * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n * See the License for the specific language governing permissions and\r\n * limitations under the License.\r\n */\r\n/**\r\n * Returns the Object resulting from parsing the given JSON, or null if the\r\n * given string does not represent a JSON object.\r\n */\r\nfunction jsonObjectOrNull(s) {\r\n var obj;\r\n try {\r\n obj = JSON.parse(s);\r\n }\r\n catch (e) {\r\n return null;\r\n }\r\n if (isNonArrayObject(obj)) {\r\n return obj;\r\n }\r\n else {\r\n return null;\r\n }\r\n}\n\n/**\r\n * @license\r\n * Copyright 2017 Google Inc.\r\n *\r\n * Licensed under the Apache License, Version 2.0 (the \"License\");\r\n * you may not use this file except in compliance with the License.\r\n * You may obtain a copy of the License at\r\n *\r\n * http://www.apache.org/licenses/LICENSE-2.0\r\n *\r\n * Unless required by applicable law or agreed to in writing, software\r\n * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n * See the License for the specific language governing permissions and\r\n * limitations under the License.\r\n */\r\n/**\r\n * @struct\r\n */\r\nvar Location = /** @class */ (function () {\r\n function Location(bucket, path) {\r\n this.bucket = bucket;\r\n this.path_ = path;\r\n }\r\n Object.defineProperty(Location.prototype, \"path\", {\r\n get: function () {\r\n return this.path_;\r\n },\r\n enumerable: true,\r\n configurable: true\r\n });\r\n Location.prototype.fullServerUrl = function () {\r\n var encode = encodeURIComponent;\r\n return '/b/' + encode(this.bucket) + '/o/' + encode(this.path);\r\n };\r\n Location.prototype.bucketOnlyServerUrl = function () {\r\n var encode = encodeURIComponent;\r\n return '/b/' + encode(this.bucket) + '/o';\r\n };\r\n Location.makeFromBucketSpec = function (bucketString) {\r\n var bucketLocation;\r\n try {\r\n bucketLocation = Location.makeFromUrl(bucketString);\r\n }\r\n catch (e) {\r\n // Not valid URL, use as-is. This lets you put bare bucket names in\r\n // config.\r\n return new Location(bucketString, '');\r\n }\r\n if (bucketLocation.path === '') {\r\n return bucketLocation;\r\n }\r\n else {\r\n throw invalidDefaultBucket(bucketString);\r\n }\r\n };\r\n Location.makeFromUrl = function (url) {\r\n var location = null;\r\n var bucketDomain = '([A-Za-z0-9.\\\\-_]+)';\r\n function gsModify(loc) {\r\n if (loc.path.charAt(loc.path.length - 1) === '/') {\r\n loc.path_ = loc.path_.slice(0, -1);\r\n }\r\n }\r\n var gsPath = '(/(.*))?$';\r\n var path = '(/([^?#]*).*)?$';\r\n var gsRegex = new RegExp('^gs://' + bucketDomain + gsPath, 'i');\r\n var gsIndices = { bucket: 1, path: 3 };\r\n function httpModify(loc) {\r\n loc.path_ = decodeURIComponent(loc.path);\r\n }\r\n var version = 'v[A-Za-z0-9_]+';\r\n var httpRegex = new RegExp('^https?://firebasestorage\\\\.googleapis\\\\.com/' +\r\n version +\r\n '/b/' +\r\n bucketDomain +\r\n '/o' +\r\n path, 'i');\r\n var httpIndices = { bucket: 1, path: 3 };\r\n var groups = [\r\n { regex: gsRegex, indices: gsIndices, postModify: gsModify },\r\n { regex: httpRegex, indices: httpIndices, postModify: httpModify }\r\n ];\r\n for (var i = 0; i < groups.length; i++) {\r\n var group = groups[i];\r\n var captures = group.regex.exec(url);\r\n if (captures) {\r\n var bucketValue = captures[group.indices.bucket];\r\n var pathValue = captures[group.indices.path];\r\n if (!pathValue) {\r\n pathValue = '';\r\n }\r\n location = new Location(bucketValue, pathValue);\r\n group.postModify(location);\r\n break;\r\n }\r\n }\r\n if (location == null) {\r\n throw invalidUrl(url);\r\n }\r\n return location;\r\n };\r\n return Location;\r\n}());\n\n/**\r\n * @license\r\n * Copyright 2017 Google Inc.\r\n *\r\n * Licensed under the Apache License, Version 2.0 (the \"License\");\r\n * you may not use this file except in compliance with the License.\r\n * You may obtain a copy of the License at\r\n *\r\n * http://www.apache.org/licenses/LICENSE-2.0\r\n *\r\n * Unless required by applicable law or agreed to in writing, software\r\n * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n * See the License for the specific language governing permissions and\r\n * limitations under the License.\r\n */\r\n/**\r\n * @fileoverview Contains helper methods for manipulating paths.\r\n */\r\n/**\r\n * @return Null if the path is already at the root.\r\n */\r\nfunction parent(path) {\r\n if (path.length == 0) {\r\n return null;\r\n }\r\n var index = path.lastIndexOf('/');\r\n if (index === -1) {\r\n return '';\r\n }\r\n var newPath = path.slice(0, index);\r\n return newPath;\r\n}\r\nfunction child(path, childPath) {\r\n var canonicalChildPath = childPath\r\n .split('/')\r\n .filter(function (component) {\r\n return component.length > 0;\r\n })\r\n .join('/');\r\n if (path.length === 0) {\r\n return canonicalChildPath;\r\n }\r\n else {\r\n return path + '/' + canonicalChildPath;\r\n }\r\n}\r\n/**\r\n * Returns the last component of a path.\r\n * '/foo/bar' -> 'bar'\r\n * '/foo/bar/baz/' -> 'baz/'\r\n * '/a' -> 'a'\r\n */\r\nfunction lastComponent(path) {\r\n var index = path.lastIndexOf('/', path.length - 2);\r\n if (index === -1) {\r\n return path;\r\n }\r\n else {\r\n return path.slice(index + 1);\r\n }\r\n}\n\n/**\r\n * @license\r\n * Copyright 2017 Google Inc.\r\n *\r\n * Licensed under the Apache License, Version 2.0 (the \"License\");\r\n * you may not use this file except in compliance with the License.\r\n * You may obtain a copy of the License at\r\n *\r\n * http://www.apache.org/licenses/LICENSE-2.0\r\n *\r\n * Unless required by applicable law or agreed to in writing, software\r\n * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n * See the License for the specific language governing permissions and\r\n * limitations under the License.\r\n */\r\nfunction makeNormalUrl(urlPart) {\r\n return domainBase + apiBaseUrl + urlPart;\r\n}\r\nfunction makeDownloadUrl(urlPart) {\r\n return downloadBase + apiBaseUrl + urlPart;\r\n}\r\nfunction makeUploadUrl(urlPart) {\r\n return domainBase + apiUploadBaseUrl + urlPart;\r\n}\r\nfunction makeQueryString(params) {\r\n var encode = encodeURIComponent;\r\n var queryPart = '?';\r\n forEach(params, function (key, val) {\r\n var nextPart = encode(key) + '=' + encode(val);\r\n queryPart = queryPart + nextPart + '&';\r\n });\r\n // Chop off the extra '&' or '?' on the end\r\n queryPart = queryPart.slice(0, -1);\r\n return queryPart;\r\n}\n\n/**\r\n * @license\r\n * Copyright 2017 Google Inc.\r\n *\r\n * Licensed under the Apache License, Version 2.0 (the \"License\");\r\n * you may not use this file except in compliance with the License.\r\n * You may obtain a copy of the License at\r\n *\r\n * http://www.apache.org/licenses/LICENSE-2.0\r\n *\r\n * Unless required by applicable law or agreed to in writing, software\r\n * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n * See the License for the specific language governing permissions and\r\n * limitations under the License.\r\n */\r\nfunction noXform_(metadata, value) {\r\n return value;\r\n}\r\n/**\r\n * @struct\r\n */\r\nvar Mapping = /** @class */ (function () {\r\n function Mapping(server, opt_local, opt_writable, opt_xform) {\r\n this.server = server;\r\n this.local = opt_local || server;\r\n this.writable = !!opt_writable;\r\n this.xform = opt_xform || noXform_;\r\n }\r\n return Mapping;\r\n}());\r\nvar mappings_ = null;\r\nfunction xformPath(fullPath) {\r\n var valid = isString(fullPath);\r\n if (!valid || fullPath.length < 2) {\r\n return fullPath;\r\n }\r\n else {\r\n fullPath = fullPath;\r\n return lastComponent(fullPath);\r\n }\r\n}\r\nfunction getMappings() {\r\n if (mappings_) {\r\n return mappings_;\r\n }\r\n var mappings = [];\r\n mappings.push(new Mapping('bucket'));\r\n mappings.push(new Mapping('generation'));\r\n mappings.push(new Mapping('metageneration'));\r\n mappings.push(new Mapping('name', 'fullPath', true));\r\n function mappingsXformPath(metadata, fullPath) {\r\n return xformPath(fullPath);\r\n }\r\n var nameMapping = new Mapping('name');\r\n nameMapping.xform = mappingsXformPath;\r\n mappings.push(nameMapping);\r\n /**\r\n * Coerces the second param to a number, if it is defined.\r\n */\r\n function xformSize(metadata, size) {\r\n if (isDef(size)) {\r\n return +size;\r\n }\r\n else {\r\n return size;\r\n }\r\n }\r\n var sizeMapping = new Mapping('size');\r\n sizeMapping.xform = xformSize;\r\n mappings.push(sizeMapping);\r\n mappings.push(new Mapping('timeCreated'));\r\n mappings.push(new Mapping('updated'));\r\n mappings.push(new Mapping('md5Hash', null, true));\r\n mappings.push(new Mapping('cacheControl', null, true));\r\n mappings.push(new Mapping('contentDisposition', null, true));\r\n mappings.push(new Mapping('contentEncoding', null, true));\r\n mappings.push(new Mapping('contentLanguage', null, true));\r\n mappings.push(new Mapping('contentType', null, true));\r\n mappings.push(new Mapping('metadata', 'customMetadata', true));\r\n mappings_ = mappings;\r\n return mappings_;\r\n}\r\nfunction addRef(metadata, authWrapper) {\r\n function generateRef() {\r\n var bucket = metadata['bucket'];\r\n var path = metadata['fullPath'];\r\n var loc = new Location(bucket, path);\r\n return authWrapper.makeStorageReference(loc);\r\n }\r\n Object.defineProperty(metadata, 'ref', { get: generateRef });\r\n}\r\nfunction fromResource(authWrapper, resource, mappings) {\r\n var metadata = {};\r\n metadata['type'] = 'file';\r\n var len = mappings.length;\r\n for (var i = 0; i < len; i++) {\r\n var mapping = mappings[i];\r\n metadata[mapping.local] = mapping.xform(metadata, resource[mapping.server]);\r\n }\r\n addRef(metadata, authWrapper);\r\n return metadata;\r\n}\r\nfunction fromResourceString(authWrapper, resourceString, mappings) {\r\n var obj = jsonObjectOrNull(resourceString);\r\n if (obj === null) {\r\n return null;\r\n }\r\n var resource = obj;\r\n return fromResource(authWrapper, resource, mappings);\r\n}\r\nfunction downloadUrlFromResourceString(metadata, resourceString) {\r\n var obj = jsonObjectOrNull(resourceString);\r\n if (obj === null) {\r\n return null;\r\n }\r\n if (!isString(obj['downloadTokens'])) {\r\n // This can happen if objects are uploaded through GCS and retrieved\r\n // through list, so we don't want to throw an Error.\r\n return null;\r\n }\r\n var tokens = obj['downloadTokens'];\r\n if (tokens.length === 0) {\r\n return null;\r\n }\r\n var encode = encodeURIComponent;\r\n var tokensList = tokens.split(',');\r\n var urls = tokensList.map(function (token) {\r\n var bucket = metadata['bucket'];\r\n var path = metadata['fullPath'];\r\n var urlPart = '/b/' + encode(bucket) + '/o/' + encode(path);\r\n var base = makeDownloadUrl(urlPart);\r\n var queryString = makeQueryString({\r\n alt: 'media',\r\n token: token\r\n });\r\n return base + queryString;\r\n });\r\n return urls[0];\r\n}\r\nfunction toResourceString(metadata, mappings) {\r\n var resource = {};\r\n var len = mappings.length;\r\n for (var i = 0; i < len; i++) {\r\n var mapping = mappings[i];\r\n if (mapping.writable) {\r\n resource[mapping.server] = metadata[mapping.local];\r\n }\r\n }\r\n return JSON.stringify(resource);\r\n}\r\nfunction metadataValidator(p) {\r\n var validType = p && isObject(p);\r\n if (!validType) {\r\n throw 'Expected Metadata object.';\r\n }\r\n for (var key in p) {\r\n var val = p[key];\r\n if (key === 'customMetadata') {\r\n if (!isObject(val)) {\r\n throw 'Expected object for \\'customMetadata\\' mapping.';\r\n }\r\n }\r\n else {\r\n if (isNonNullObject(val)) {\r\n throw \"Mapping for '\" + key + \"' cannot be an object.\";\r\n }\r\n }\r\n }\r\n}\n\n/**\r\n * @license\r\n * Copyright 2017 Google Inc.\r\n *\r\n * Licensed under the Apache License, Version 2.0 (the \"License\");\r\n * you may not use this file except in compliance with the License.\r\n * You may obtain a copy of the License at\r\n *\r\n * http://www.apache.org/licenses/LICENSE-2.0\r\n *\r\n * Unless required by applicable law or agreed to in writing, software\r\n * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n * See the License for the specific language governing permissions and\r\n * limitations under the License.\r\n */\r\n/**\r\n * @param name Name of the function.\r\n * @param specs Argument specs.\r\n * @param passed The actual arguments passed to the function.\r\n * @throws {fbs.Error} If the arguments are invalid.\r\n */\r\nfunction validate(name, specs, passed) {\r\n var minArgs = specs.length;\r\n var maxArgs = specs.length;\r\n for (var i = 0; i < specs.length; i++) {\r\n if (specs[i].optional) {\r\n minArgs = i;\r\n break;\r\n }\r\n }\r\n var validLength = minArgs <= passed.length && passed.length <= maxArgs;\r\n if (!validLength) {\r\n throw invalidArgumentCount(minArgs, maxArgs, name, passed.length);\r\n }\r\n for (var i = 0; i < passed.length; i++) {\r\n try {\r\n specs[i].validator(passed[i]);\r\n }\r\n catch (e) {\r\n if (e instanceof Error) {\r\n throw invalidArgument(i, name, e.message);\r\n }\r\n else {\r\n throw invalidArgument(i, name, e);\r\n }\r\n }\r\n }\r\n}\r\n/**\r\n * @struct\r\n */\r\nvar ArgSpec = /** @class */ (function () {\r\n function ArgSpec(validator, opt_optional) {\r\n var self = this;\r\n this.validator = function (p) {\r\n if (self.optional && !isJustDef(p)) {\r\n return;\r\n }\r\n validator(p);\r\n };\r\n this.optional = !!opt_optional;\r\n }\r\n return ArgSpec;\r\n}());\r\nfunction and_(v1, v2) {\r\n return function (p) {\r\n v1(p);\r\n v2(p);\r\n };\r\n}\r\nfunction stringSpec(opt_validator, opt_optional) {\r\n function stringValidator(p) {\r\n if (!isString(p)) {\r\n throw 'Expected string.';\r\n }\r\n }\r\n var validator;\r\n if (opt_validator) {\r\n validator = and_(stringValidator, opt_validator);\r\n }\r\n else {\r\n validator = stringValidator;\r\n }\r\n return new ArgSpec(validator, opt_optional);\r\n}\r\nfunction uploadDataSpec() {\r\n function validator(p) {\r\n var valid = p instanceof Uint8Array ||\r\n p instanceof ArrayBuffer ||\r\n (isNativeBlobDefined() && p instanceof Blob);\r\n if (!valid) {\r\n throw 'Expected Blob or File.';\r\n }\r\n }\r\n return new ArgSpec(validator);\r\n}\r\nfunction metadataSpec(opt_optional) {\r\n return new ArgSpec(metadataValidator, opt_optional);\r\n}\r\nfunction nonNegativeNumberSpec() {\r\n function validator(p) {\r\n var valid = isNumber(p) && p >= 0;\r\n if (!valid) {\r\n throw 'Expected a number 0 or greater.';\r\n }\r\n }\r\n return new ArgSpec(validator);\r\n}\r\nfunction looseObjectSpec(opt_validator, opt_optional) {\r\n function validator(p) {\r\n var isLooseObject = p === null || (isDef(p) && p instanceof Object);\r\n if (!isLooseObject) {\r\n throw 'Expected an Object.';\r\n }\r\n if (opt_validator !== undefined && opt_validator !== null) {\r\n opt_validator(p);\r\n }\r\n }\r\n return new ArgSpec(validator, opt_optional);\r\n}\r\nfunction nullFunctionSpec(opt_optional) {\r\n function validator(p) {\r\n var valid = p === null || isFunction(p);\r\n if (!valid) {\r\n throw 'Expected a Function.';\r\n }\r\n }\r\n return new ArgSpec(validator, opt_optional);\r\n}\n\nfunction getBlobBuilder() {\r\n if (typeof BlobBuilder !== 'undefined') {\r\n return BlobBuilder;\r\n }\r\n else if (typeof WebKitBlobBuilder !== 'undefined') {\r\n return WebKitBlobBuilder;\r\n }\r\n else {\r\n return undefined;\r\n }\r\n}\r\n/**\r\n * Concatenates one or more values together and converts them to a Blob.\r\n *\r\n * @param var_args The values that will make up the resulting blob.\r\n * @return The blob.\r\n */\r\nfunction getBlob() {\r\n var var_args = [];\r\n for (var _i = 0; _i < arguments.length; _i++) {\r\n var_args[_i] = arguments[_i];\r\n }\r\n var BlobBuilder = getBlobBuilder();\r\n if (BlobBuilder !== undefined) {\r\n var bb = new BlobBuilder();\r\n for (var i = 0; i < var_args.length; i++) {\r\n bb.append(var_args[i]);\r\n }\r\n return bb.getBlob();\r\n }\r\n else {\r\n if (isNativeBlobDefined()) {\r\n return new Blob(var_args);\r\n }\r\n else {\r\n throw Error(\"This browser doesn't seem to support creating Blobs\");\r\n }\r\n }\r\n}\r\n/**\r\n * Slices the blob. The returned blob contains data from the start byte\r\n * (inclusive) till the end byte (exclusive). Negative indices cannot be used.\r\n *\r\n * @param blob The blob to be sliced.\r\n * @param start Index of the starting byte.\r\n * @param end Index of the ending byte.\r\n * @return The blob slice or null if not supported.\r\n */\r\nfunction sliceBlob(blob, start, end) {\r\n if (blob.webkitSlice) {\r\n return blob.webkitSlice(start, end);\r\n }\r\n else if (blob.mozSlice) {\r\n return blob.mozSlice(start, end);\r\n }\r\n else if (blob.slice) {\r\n return blob.slice(start, end);\r\n }\r\n return null;\r\n}\n\n/**\r\n * @license\r\n * Copyright 2017 Google Inc.\r\n *\r\n * Licensed under the Apache License, Version 2.0 (the \"License\");\r\n * you may not use this file except in compliance with the License.\r\n * You may obtain a copy of the License at\r\n *\r\n * http://www.apache.org/licenses/LICENSE-2.0\r\n *\r\n * Unless required by applicable law or agreed to in writing, software\r\n * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n * See the License for the specific language governing permissions and\r\n * limitations under the License.\r\n */\r\n/**\r\n * @param opt_elideCopy If true, doesn't copy mutable input data\r\n * (e.g. Uint8Arrays). Pass true only if you know the objects will not be\r\n * modified after this blob's construction.\r\n */\r\nvar FbsBlob = /** @class */ (function () {\r\n function FbsBlob(data, opt_elideCopy) {\r\n var size = 0;\r\n var blobType = '';\r\n if (isNativeBlob(data)) {\r\n this.data_ = data;\r\n size = data.size;\r\n blobType = data.type;\r\n }\r\n else if (data instanceof ArrayBuffer) {\r\n if (opt_elideCopy) {\r\n this.data_ = new Uint8Array(data);\r\n }\r\n else {\r\n this.data_ = new Uint8Array(data.byteLength);\r\n this.data_.set(new Uint8Array(data));\r\n }\r\n size = this.data_.length;\r\n }\r\n else if (data instanceof Uint8Array) {\r\n if (opt_elideCopy) {\r\n this.data_ = data;\r\n }\r\n else {\r\n this.data_ = new Uint8Array(data.length);\r\n this.data_.set(data);\r\n }\r\n size = data.length;\r\n }\r\n this.size_ = size;\r\n this.type_ = blobType;\r\n }\r\n FbsBlob.prototype.size = function () {\r\n return this.size_;\r\n };\r\n FbsBlob.prototype.type = function () {\r\n return this.type_;\r\n };\r\n FbsBlob.prototype.slice = function (startByte, endByte) {\r\n if (isNativeBlob(this.data_)) {\r\n var realBlob = this.data_;\r\n var sliced = sliceBlob(realBlob, startByte, endByte);\r\n if (sliced === null) {\r\n return null;\r\n }\r\n return new FbsBlob(sliced);\r\n }\r\n else {\r\n var slice = new Uint8Array(this.data_.buffer, startByte, endByte - startByte);\r\n return new FbsBlob(slice, true);\r\n }\r\n };\r\n FbsBlob.getBlob = function () {\r\n var var_args = [];\r\n for (var _i = 0; _i < arguments.length; _i++) {\r\n var_args[_i] = arguments[_i];\r\n }\r\n if (isNativeBlobDefined()) {\r\n var blobby = var_args.map(function (val) {\r\n if (val instanceof FbsBlob) {\r\n return val.data_;\r\n }\r\n else {\r\n return val;\r\n }\r\n });\r\n return new FbsBlob(getBlob.apply(null, blobby));\r\n }\r\n else {\r\n var uint8Arrays = var_args.map(function (val) {\r\n if (isString(val)) {\r\n return dataFromString(StringFormat.RAW, val).data;\r\n }\r\n else {\r\n // Blobs don't exist, so this has to be a Uint8Array.\r\n return val.data_;\r\n }\r\n });\r\n var finalLength_1 = 0;\r\n uint8Arrays.forEach(function (array) {\r\n finalLength_1 += array.byteLength;\r\n });\r\n var merged_1 = new Uint8Array(finalLength_1);\r\n var index_1 = 0;\r\n uint8Arrays.forEach(function (array) {\r\n for (var i = 0; i < array.length; i++) {\r\n merged_1[index_1++] = array[i];\r\n }\r\n });\r\n return new FbsBlob(merged_1, true);\r\n }\r\n };\r\n FbsBlob.prototype.uploadData = function () {\r\n return this.data_;\r\n };\r\n return FbsBlob;\r\n}());\n\n/**\r\n * @license\r\n * Copyright 2017 Google Inc.\r\n *\r\n * Licensed under the Apache License, Version 2.0 (the \"License\");\r\n * you may not use this file except in compliance with the License.\r\n * You may obtain a copy of the License at\r\n *\r\n * http://www.apache.org/licenses/LICENSE-2.0\r\n *\r\n * Unless required by applicable law or agreed to in writing, software\r\n * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n * See the License for the specific language governing permissions and\r\n * limitations under the License.\r\n */\r\n/**\r\n * Returns true if the object is contained in the array (compared with ===).\r\n * @template T\r\n */\r\nfunction contains$1(array, elem) {\r\n return array.indexOf(elem) !== -1;\r\n}\r\n/**\r\n * Returns a shallow copy of the array or array-like object (e.g. arguments).\r\n * @template T\r\n */\r\nfunction clone$1(arraylike) {\r\n return Array.prototype.slice.call(arraylike);\r\n}\r\n/**\r\n * Removes the given element from the given array, if it is contained.\r\n * Directly modifies the passed-in array.\r\n * @template T\r\n */\r\nfunction remove(array, elem) {\r\n var i = array.indexOf(elem);\r\n if (i !== -1) {\r\n array.splice(i, 1);\r\n }\r\n}\n\nvar RequestInfo = /** @class */ (function () {\r\n function RequestInfo(url, method, \r\n /**\r\n * Returns the value with which to resolve the request's promise. Only called\r\n * if the request is successful. Throw from this function to reject the\r\n * returned Request's promise with the thrown error.\r\n * Note: The XhrIo passed to this function may be reused after this callback\r\n * returns. Do not keep a reference to it in any way.\r\n */\r\n handler, timeout) {\r\n this.url = url;\r\n this.method = method;\r\n this.handler = handler;\r\n this.timeout = timeout;\r\n this.urlParams = {};\r\n this.headers = {};\r\n this.body = null;\r\n this.errorHandler = null;\r\n /**\r\n * Called with the current number of bytes uploaded and total size (-1 if not\r\n * computable) of the request body (i.e. used to report upload progress).\r\n */\r\n this.progressCallback = null;\r\n this.successCodes = [200];\r\n this.additionalRetryCodes = [];\r\n }\r\n return RequestInfo;\r\n}());\n\n/**\r\n * @license\r\n * Copyright 2017 Google Inc.\r\n *\r\n * Licensed under the Apache License, Version 2.0 (the \"License\");\r\n * you may not use this file except in compliance with the License.\r\n * You may obtain a copy of the License at\r\n *\r\n * http://www.apache.org/licenses/LICENSE-2.0\r\n *\r\n * Unless required by applicable law or agreed to in writing, software\r\n * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n * See the License for the specific language governing permissions and\r\n * limitations under the License.\r\n */\r\n/**\r\n * Throws the UNKNOWN FirebaseStorageError if cndn is false.\r\n */\r\nfunction handlerCheck(cndn) {\r\n if (!cndn) {\r\n throw unknown();\r\n }\r\n}\r\nfunction metadataHandler(authWrapper, mappings) {\r\n function handler(xhr, text) {\r\n var metadata = fromResourceString(authWrapper, text, mappings);\r\n handlerCheck(metadata !== null);\r\n return metadata;\r\n }\r\n return handler;\r\n}\r\nfunction downloadUrlHandler(authWrapper, mappings) {\r\n function handler(xhr, text) {\r\n var metadata = fromResourceString(authWrapper, text, mappings);\r\n handlerCheck(metadata !== null);\r\n return downloadUrlFromResourceString(metadata, text);\r\n }\r\n return handler;\r\n}\r\nfunction sharedErrorHandler(location) {\r\n function errorHandler(xhr, err) {\r\n var newErr;\r\n if (xhr.getStatus() === 401) {\r\n newErr = unauthenticated();\r\n }\r\n else {\r\n if (xhr.getStatus() === 402) {\r\n newErr = quotaExceeded(location.bucket);\r\n }\r\n else {\r\n if (xhr.getStatus() === 403) {\r\n newErr = unauthorized(location.path);\r\n }\r\n else {\r\n newErr = err;\r\n }\r\n }\r\n }\r\n newErr.setServerResponseProp(err.serverResponseProp());\r\n return newErr;\r\n }\r\n return errorHandler;\r\n}\r\nfunction objectErrorHandler(location) {\r\n var shared = sharedErrorHandler(location);\r\n function errorHandler(xhr, err) {\r\n var newErr = shared(xhr, err);\r\n if (xhr.getStatus() === 404) {\r\n newErr = objectNotFound(location.path);\r\n }\r\n newErr.setServerResponseProp(err.serverResponseProp());\r\n return newErr;\r\n }\r\n return errorHandler;\r\n}\r\nfunction getMetadata(authWrapper, location, mappings) {\r\n var urlPart = location.fullServerUrl();\r\n var url = makeNormalUrl(urlPart);\r\n var method = 'GET';\r\n var timeout = authWrapper.maxOperationRetryTime();\r\n var requestInfo = new RequestInfo(url, method, metadataHandler(authWrapper, mappings), timeout);\r\n requestInfo.errorHandler = objectErrorHandler(location);\r\n return requestInfo;\r\n}\r\nfunction getDownloadUrl(authWrapper, location, mappings) {\r\n var urlPart = location.fullServerUrl();\r\n var url = makeNormalUrl(urlPart);\r\n var method = 'GET';\r\n var timeout = authWrapper.maxOperationRetryTime();\r\n var requestInfo = new RequestInfo(url, method, downloadUrlHandler(authWrapper, mappings), timeout);\r\n requestInfo.errorHandler = objectErrorHandler(location);\r\n return requestInfo;\r\n}\r\nfunction updateMetadata(authWrapper, location, metadata, mappings) {\r\n var urlPart = location.fullServerUrl();\r\n var url = makeNormalUrl(urlPart);\r\n var method = 'PATCH';\r\n var body = toResourceString(metadata, mappings);\r\n var headers = { 'Content-Type': 'application/json; charset=utf-8' };\r\n var timeout = authWrapper.maxOperationRetryTime();\r\n var requestInfo = new RequestInfo(url, method, metadataHandler(authWrapper, mappings), timeout);\r\n requestInfo.headers = headers;\r\n requestInfo.body = body;\r\n requestInfo.errorHandler = objectErrorHandler(location);\r\n return requestInfo;\r\n}\r\nfunction deleteObject(authWrapper, location) {\r\n var urlPart = location.fullServerUrl();\r\n var url = makeNormalUrl(urlPart);\r\n var method = 'DELETE';\r\n var timeout = authWrapper.maxOperationRetryTime();\r\n function handler(xhr, text) { }\r\n var requestInfo = new RequestInfo(url, method, handler, timeout);\r\n requestInfo.successCodes = [200, 204];\r\n requestInfo.errorHandler = objectErrorHandler(location);\r\n return requestInfo;\r\n}\r\nfunction determineContentType_(metadata, blob) {\r\n return ((metadata && metadata['contentType']) ||\r\n (blob && blob.type()) ||\r\n 'application/octet-stream');\r\n}\r\nfunction metadataForUpload_(location, blob, opt_metadata) {\r\n var metadata = clone(opt_metadata);\r\n metadata['fullPath'] = location.path;\r\n metadata['size'] = blob.size();\r\n if (!metadata['contentType']) {\r\n metadata['contentType'] = determineContentType_(null, blob);\r\n }\r\n return metadata;\r\n}\r\nfunction multipartUpload(authWrapper, location, mappings, blob, opt_metadata) {\r\n var urlPart = location.bucketOnlyServerUrl();\r\n var headers = {\r\n 'X-Goog-Upload-Protocol': 'multipart'\r\n };\r\n function genBoundary() {\r\n var str = '';\r\n for (var i = 0; i < 2; i++) {\r\n str =\r\n str +\r\n Math.random()\r\n .toString()\r\n .slice(2);\r\n }\r\n return str;\r\n }\r\n var boundary = genBoundary();\r\n headers['Content-Type'] = 'multipart/related; boundary=' + boundary;\r\n var metadata = metadataForUpload_(location, blob, opt_metadata);\r\n var metadataString = toResourceString(metadata, mappings);\r\n var preBlobPart = '--' +\r\n boundary +\r\n '\\r\\n' +\r\n 'Content-Type: application/json; charset=utf-8\\r\\n\\r\\n' +\r\n metadataString +\r\n '\\r\\n--' +\r\n boundary +\r\n '\\r\\n' +\r\n 'Content-Type: ' +\r\n metadata['contentType'] +\r\n '\\r\\n\\r\\n';\r\n var postBlobPart = '\\r\\n--' + boundary + '--';\r\n var body = FbsBlob.getBlob(preBlobPart, blob, postBlobPart);\r\n if (body === null) {\r\n throw cannotSliceBlob();\r\n }\r\n var urlParams = { name: metadata['fullPath'] };\r\n var url = makeUploadUrl(urlPart);\r\n var method = 'POST';\r\n var timeout = authWrapper.maxUploadRetryTime();\r\n var requestInfo = new RequestInfo(url, method, metadataHandler(authWrapper, mappings), timeout);\r\n requestInfo.urlParams = urlParams;\r\n requestInfo.headers = headers;\r\n requestInfo.body = body.uploadData();\r\n requestInfo.errorHandler = sharedErrorHandler(location);\r\n return requestInfo;\r\n}\r\n/**\r\n * @param current The number of bytes that have been uploaded so far.\r\n * @param total The total number of bytes in the upload.\r\n * @param opt_finalized True if the server has finished the upload.\r\n * @param opt_metadata The upload metadata, should\r\n * only be passed if opt_finalized is true.\r\n * @struct\r\n */\r\nvar ResumableUploadStatus = /** @class */ (function () {\r\n function ResumableUploadStatus(current, total, finalized, metadata) {\r\n this.current = current;\r\n this.total = total;\r\n this.finalized = !!finalized;\r\n this.metadata = metadata || null;\r\n }\r\n return ResumableUploadStatus;\r\n}());\r\nfunction checkResumeHeader_(xhr, opt_allowed) {\r\n var status;\r\n try {\r\n status = xhr.getResponseHeader('X-Goog-Upload-Status');\r\n }\r\n catch (e) {\r\n handlerCheck(false);\r\n }\r\n var allowed = opt_allowed || ['active'];\r\n handlerCheck(contains$1(allowed, status));\r\n return status;\r\n}\r\nfunction createResumableUpload(authWrapper, location, mappings, blob, opt_metadata) {\r\n var urlPart = location.bucketOnlyServerUrl();\r\n var metadata = metadataForUpload_(location, blob, opt_metadata);\r\n var urlParams = { name: metadata['fullPath'] };\r\n var url = makeUploadUrl(urlPart);\r\n var method = 'POST';\r\n var headers = {\r\n 'X-Goog-Upload-Protocol': 'resumable',\r\n 'X-Goog-Upload-Command': 'start',\r\n 'X-Goog-Upload-Header-Content-Length': blob.size(),\r\n 'X-Goog-Upload-Header-Content-Type': metadata['contentType'],\r\n 'Content-Type': 'application/json; charset=utf-8'\r\n };\r\n var body = toResourceString(metadata, mappings);\r\n var timeout = authWrapper.maxUploadRetryTime();\r\n function handler(xhr, text) {\r\n checkResumeHeader_(xhr);\r\n var url;\r\n try {\r\n url = xhr.getResponseHeader('X-Goog-Upload-URL');\r\n }\r\n catch (e) {\r\n handlerCheck(false);\r\n }\r\n handlerCheck(isString(url));\r\n return url;\r\n }\r\n var requestInfo = new RequestInfo(url, method, handler, timeout);\r\n requestInfo.urlParams = urlParams;\r\n requestInfo.headers = headers;\r\n requestInfo.body = body;\r\n requestInfo.errorHandler = sharedErrorHandler(location);\r\n return requestInfo;\r\n}\r\n/**\r\n * @param url From a call to fbs.requests.createResumableUpload.\r\n */\r\nfunction getResumableUploadStatus(authWrapper, location, url, blob) {\r\n var headers = { 'X-Goog-Upload-Command': 'query' };\r\n function handler(xhr, text) {\r\n var status = checkResumeHeader_(xhr, ['active', 'final']);\r\n var sizeString;\r\n try {\r\n sizeString = xhr.getResponseHeader('X-Goog-Upload-Size-Received');\r\n }\r\n catch (e) {\r\n handlerCheck(false);\r\n }\r\n var size = parseInt(sizeString, 10);\r\n handlerCheck(!isNaN(size));\r\n return new ResumableUploadStatus(size, blob.size(), status === 'final');\r\n }\r\n var method = 'POST';\r\n var timeout = authWrapper.maxUploadRetryTime();\r\n var requestInfo = new RequestInfo(url, method, handler, timeout);\r\n requestInfo.headers = headers;\r\n requestInfo.errorHandler = sharedErrorHandler(location);\r\n return requestInfo;\r\n}\r\n/**\r\n * Any uploads via the resumable upload API must transfer a number of bytes\r\n * that is a multiple of this number.\r\n */\r\nvar resumableUploadChunkSize = 256 * 1024;\r\n/**\r\n * @param url From a call to fbs.requests.createResumableUpload.\r\n * @param chunkSize Number of bytes to upload.\r\n * @param opt_status The previous status.\r\n * If not passed or null, we start from the beginning.\r\n * @throws fbs.Error If the upload is already complete, the passed in status\r\n * has a final size inconsistent with the blob, or the blob cannot be sliced\r\n * for upload.\r\n */\r\nfunction continueResumableUpload(location, authWrapper, url, blob, chunkSize, mappings, opt_status, opt_progressCallback) {\r\n // TODO(andysoto): standardize on internal asserts\r\n // assert(!(opt_status && opt_status.finalized));\r\n var status = new ResumableUploadStatus(0, 0);\r\n if (opt_status) {\r\n status.current = opt_status.current;\r\n status.total = opt_status.total;\r\n }\r\n else {\r\n status.current = 0;\r\n status.total = blob.size();\r\n }\r\n if (blob.size() !== status.total) {\r\n throw serverFileWrongSize();\r\n }\r\n var bytesLeft = status.total - status.current;\r\n var bytesToUpload = bytesLeft;\r\n if (chunkSize > 0) {\r\n bytesToUpload = Math.min(bytesToUpload, chunkSize);\r\n }\r\n var startByte = status.current;\r\n var endByte = startByte + bytesToUpload;\r\n var uploadCommand = bytesToUpload === bytesLeft ? 'upload, finalize' : 'upload';\r\n var headers = {\r\n 'X-Goog-Upload-Command': uploadCommand,\r\n 'X-Goog-Upload-Offset': status.current\r\n };\r\n var body = blob.slice(startByte, endByte);\r\n if (body === null) {\r\n throw cannotSliceBlob();\r\n }\r\n function handler(xhr, text) {\r\n // TODO(andysoto): Verify the MD5 of each uploaded range:\r\n // the 'x-range-md5' header comes back with status code 308 responses.\r\n // We'll only be able to bail out though, because you can't re-upload a\r\n // range that you previously uploaded.\r\n var uploadStatus = checkResumeHeader_(xhr, ['active', 'final']);\r\n var newCurrent = status.current + bytesToUpload;\r\n var size = blob.size();\r\n var metadata;\r\n if (uploadStatus === 'final') {\r\n metadata = metadataHandler(authWrapper, mappings)(xhr, text);\r\n }\r\n else {\r\n metadata = null;\r\n }\r\n return new ResumableUploadStatus(newCurrent, size, uploadStatus === 'final', metadata);\r\n }\r\n var method = 'POST';\r\n var timeout = authWrapper.maxUploadRetryTime();\r\n var requestInfo = new RequestInfo(url, method, handler, timeout);\r\n requestInfo.headers = headers;\r\n requestInfo.body = body.uploadData();\r\n requestInfo.progressCallback = opt_progressCallback || null;\r\n requestInfo.errorHandler = sharedErrorHandler(location);\r\n return requestInfo;\r\n}\n\n/**\r\n * @license\r\n * Copyright 2017 Google Inc.\r\n *\r\n * Licensed under the Apache License, Version 2.0 (the \"License\");\r\n * you may not use this file except in compliance with the License.\r\n * You may obtain a copy of the License at\r\n *\r\n * http://www.apache.org/licenses/LICENSE-2.0\r\n *\r\n * Unless required by applicable law or agreed to in writing, software\r\n * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n * See the License for the specific language governing permissions and\r\n * limitations under the License.\r\n */\r\n/**\r\n * @struct\r\n */\r\nvar Observer = /** @class */ (function () {\r\n function Observer(nextOrObserver, opt_error, opt_complete) {\r\n var asFunctions = isFunction(nextOrObserver) ||\r\n isDef(opt_error) ||\r\n isDef(opt_complete);\r\n if (asFunctions) {\r\n this.next = nextOrObserver;\r\n this.error = opt_error || null;\r\n this.complete = opt_complete || null;\r\n }\r\n else {\r\n var observer = nextOrObserver;\r\n this.next = observer.next || null;\r\n this.error = observer.error || null;\r\n this.complete = observer.complete || null;\r\n }\r\n }\r\n return Observer;\r\n}());\n\nvar UploadTaskSnapshot = /** @class */ (function () {\r\n function UploadTaskSnapshot(bytesTransferred, totalBytes, state, metadata, task, ref) {\r\n this.bytesTransferred = bytesTransferred;\r\n this.totalBytes = totalBytes;\r\n this.state = state;\r\n this.metadata = metadata;\r\n this.task = task;\r\n this.ref = ref;\r\n }\r\n return UploadTaskSnapshot;\r\n}());\n\n/**\r\n * @license\r\n * Copyright 2017 Google Inc.\r\n *\r\n * Licensed under the Apache License, Version 2.0 (the \"License\");\r\n * you may not use this file except in compliance with the License.\r\n * You may obtain a copy of the License at\r\n *\r\n * http://www.apache.org/licenses/LICENSE-2.0\r\n *\r\n * Unless required by applicable law or agreed to in writing, software\r\n * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n * See the License for the specific language governing permissions and\r\n * limitations under the License.\r\n */\r\n/**\r\n * Returns a function that invokes f with its arguments asynchronously as a\r\n * microtask, i.e. as soon as possible after the current script returns back\r\n * into browser code.\r\n */\r\nfunction async(f) {\r\n return function () {\r\n var argsToForward = [];\r\n for (var _i = 0; _i < arguments.length; _i++) {\r\n argsToForward[_i] = arguments[_i];\r\n }\r\n resolve(true).then(function () {\r\n f.apply(null, argsToForward);\r\n });\r\n };\r\n}\n\n/**\r\n * @license\r\n * Copyright 2017 Google Inc.\r\n *\r\n * Licensed under the Apache License, Version 2.0 (the \"License\");\r\n * you may not use this file except in compliance with the License.\r\n * You may obtain a copy of the License at\r\n *\r\n * http://www.apache.org/licenses/LICENSE-2.0\r\n *\r\n * Unless required by applicable law or agreed to in writing, software\r\n * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n * See the License for the specific language governing permissions and\r\n * limitations under the License.\r\n */\r\n/**\r\n * Represents a blob being uploaded. Can be used to pause/resume/cancel the\r\n * upload and manage callbacks for various events.\r\n */\r\nvar UploadTask = /** @class */ (function () {\r\n /**\r\n * @param ref The firebaseStorage.Reference object this task came\r\n * from, untyped to avoid cyclic dependencies.\r\n * @param blob The blob to upload.\r\n */\r\n function UploadTask(ref, authWrapper, location, mappings, blob, metadata) {\r\n if (metadata === void 0) { metadata = null; }\r\n var _this = this;\r\n this.transferred_ = 0;\r\n this.needToFetchStatus_ = false;\r\n this.needToFetchMetadata_ = false;\r\n this.observers_ = [];\r\n this.error_ = null;\r\n this.uploadUrl_ = null;\r\n this.request_ = null;\r\n this.chunkMultiplier_ = 1;\r\n this.resolve_ = null;\r\n this.reject_ = null;\r\n this.ref_ = ref;\r\n this.authWrapper_ = authWrapper;\r\n this.location_ = location;\r\n this.blob_ = blob;\r\n this.metadata_ = metadata;\r\n this.mappings_ = mappings;\r\n this.resumable_ = this.shouldDoResumable_(this.blob_);\r\n this.state_ = InternalTaskState.RUNNING;\r\n this.errorHandler_ = function (error) {\r\n _this.request_ = null;\r\n _this.chunkMultiplier_ = 1;\r\n if (error.codeEquals(Code.CANCELED)) {\r\n _this.needToFetchStatus_ = true;\r\n _this.completeTransitions_();\r\n }\r\n else {\r\n _this.error_ = error;\r\n _this.transition_(InternalTaskState.ERROR);\r\n }\r\n };\r\n this.metadataErrorHandler_ = function (error) {\r\n _this.request_ = null;\r\n if (error.codeEquals(Code.CANCELED)) {\r\n _this.completeTransitions_();\r\n }\r\n else {\r\n _this.error_ = error;\r\n _this.transition_(InternalTaskState.ERROR);\r\n }\r\n };\r\n this.promise_ = make(function (resolve, reject) {\r\n _this.resolve_ = resolve;\r\n _this.reject_ = reject;\r\n _this.start_();\r\n });\r\n // Prevent uncaught rejections on the internal promise from bubbling out\r\n // to the top level with a dummy handler.\r\n this.promise_.then(null, function () { });\r\n }\r\n UploadTask.prototype.makeProgressCallback_ = function () {\r\n var _this = this;\r\n var sizeBefore = this.transferred_;\r\n return function (loaded, total) {\r\n _this.updateProgress_(sizeBefore + loaded);\r\n };\r\n };\r\n UploadTask.prototype.shouldDoResumable_ = function (blob) {\r\n return blob.size() > 256 * 1024;\r\n };\r\n UploadTask.prototype.start_ = function () {\r\n if (this.state_ !== InternalTaskState.RUNNING) {\r\n // This can happen if someone pauses us in a resume callback, for example.\r\n return;\r\n }\r\n if (this.request_ !== null) {\r\n return;\r\n }\r\n if (this.resumable_) {\r\n if (this.uploadUrl_ === null) {\r\n this.createResumable_();\r\n }\r\n else {\r\n if (this.needToFetchStatus_) {\r\n this.fetchStatus_();\r\n }\r\n else {\r\n if (this.needToFetchMetadata_) {\r\n // Happens if we miss the metadata on upload completion.\r\n this.fetchMetadata_();\r\n }\r\n else {\r\n this.continueUpload_();\r\n }\r\n }\r\n }\r\n }\r\n else {\r\n this.oneShotUpload_();\r\n }\r\n };\r\n UploadTask.prototype.resolveToken_ = function (callback) {\r\n var _this = this;\r\n this.authWrapper_.getAuthToken().then(function (authToken) {\r\n switch (_this.state_) {\r\n case InternalTaskState.RUNNING:\r\n callback(authToken);\r\n break;\r\n case InternalTaskState.CANCELING:\r\n _this.transition_(InternalTaskState.CANCELED);\r\n break;\r\n case InternalTaskState.PAUSING:\r\n _this.transition_(InternalTaskState.PAUSED);\r\n break;\r\n default:\r\n }\r\n });\r\n };\r\n // TODO(andysoto): assert false\r\n UploadTask.prototype.createResumable_ = function () {\r\n var _this = this;\r\n this.resolveToken_(function (authToken) {\r\n var requestInfo = createResumableUpload(_this.authWrapper_, _this.location_, _this.mappings_, _this.blob_, _this.metadata_);\r\n var createRequest = _this.authWrapper_.makeRequest(requestInfo, authToken);\r\n _this.request_ = createRequest;\r\n createRequest.getPromise().then(function (url) {\r\n _this.request_ = null;\r\n _this.uploadUrl_ = url;\r\n _this.needToFetchStatus_ = false;\r\n _this.completeTransitions_();\r\n }, _this.errorHandler_);\r\n });\r\n };\r\n UploadTask.prototype.fetchStatus_ = function () {\r\n var _this = this;\r\n // TODO(andysoto): assert(this.uploadUrl_ !== null);\r\n var url = this.uploadUrl_;\r\n this.resolveToken_(function (authToken) {\r\n var requestInfo = getResumableUploadStatus(_this.authWrapper_, _this.location_, url, _this.blob_);\r\n var statusRequest = _this.authWrapper_.makeRequest(requestInfo, authToken);\r\n _this.request_ = statusRequest;\r\n statusRequest.getPromise().then(function (status) {\r\n status = status;\r\n _this.request_ = null;\r\n _this.updateProgress_(status.current);\r\n _this.needToFetchStatus_ = false;\r\n if (status.finalized) {\r\n _this.needToFetchMetadata_ = true;\r\n }\r\n _this.completeTransitions_();\r\n }, _this.errorHandler_);\r\n });\r\n };\r\n UploadTask.prototype.continueUpload_ = function () {\r\n var _this = this;\r\n var chunkSize = resumableUploadChunkSize * this.chunkMultiplier_;\r\n var status = new ResumableUploadStatus(this.transferred_, this.blob_.size());\r\n // TODO(andysoto): assert(this.uploadUrl_ !== null);\r\n var url = this.uploadUrl_;\r\n this.resolveToken_(function (authToken) {\r\n var requestInfo;\r\n try {\r\n requestInfo = continueResumableUpload(_this.location_, _this.authWrapper_, url, _this.blob_, chunkSize, _this.mappings_, status, _this.makeProgressCallback_());\r\n }\r\n catch (e) {\r\n _this.error_ = e;\r\n _this.transition_(InternalTaskState.ERROR);\r\n return;\r\n }\r\n var uploadRequest = _this.authWrapper_.makeRequest(requestInfo, authToken);\r\n _this.request_ = uploadRequest;\r\n uploadRequest\r\n .getPromise()\r\n .then(function (newStatus) {\r\n _this.increaseMultiplier_();\r\n _this.request_ = null;\r\n _this.updateProgress_(newStatus.current);\r\n if (newStatus.finalized) {\r\n _this.metadata_ = newStatus.metadata;\r\n _this.transition_(InternalTaskState.SUCCESS);\r\n }\r\n else {\r\n _this.completeTransitions_();\r\n }\r\n }, _this.errorHandler_);\r\n });\r\n };\r\n UploadTask.prototype.increaseMultiplier_ = function () {\r\n var currentSize = resumableUploadChunkSize * this.chunkMultiplier_;\r\n // Max chunk size is 32M.\r\n if (currentSize < 32 * 1024 * 1024) {\r\n this.chunkMultiplier_ *= 2;\r\n }\r\n };\r\n UploadTask.prototype.fetchMetadata_ = function () {\r\n var _this = this;\r\n this.resolveToken_(function (authToken) {\r\n var requestInfo = getMetadata(_this.authWrapper_, _this.location_, _this.mappings_);\r\n var metadataRequest = _this.authWrapper_.makeRequest(requestInfo, authToken);\r\n _this.request_ = metadataRequest;\r\n metadataRequest.getPromise().then(function (metadata) {\r\n _this.request_ = null;\r\n _this.metadata_ = metadata;\r\n _this.transition_(InternalTaskState.SUCCESS);\r\n }, _this.metadataErrorHandler_);\r\n });\r\n };\r\n UploadTask.prototype.oneShotUpload_ = function () {\r\n var _this = this;\r\n this.resolveToken_(function (authToken) {\r\n var requestInfo = multipartUpload(_this.authWrapper_, _this.location_, _this.mappings_, _this.blob_, _this.metadata_);\r\n var multipartRequest = _this.authWrapper_.makeRequest(requestInfo, authToken);\r\n _this.request_ = multipartRequest;\r\n multipartRequest.getPromise().then(function (metadata) {\r\n _this.request_ = null;\r\n _this.metadata_ = metadata;\r\n _this.updateProgress_(_this.blob_.size());\r\n _this.transition_(InternalTaskState.SUCCESS);\r\n }, _this.errorHandler_);\r\n });\r\n };\r\n UploadTask.prototype.updateProgress_ = function (transferred) {\r\n var old = this.transferred_;\r\n this.transferred_ = transferred;\r\n // A progress update can make the \"transferred\" value smaller (e.g. a\r\n // partial upload not completed by server, after which the \"transferred\"\r\n // value may reset to the value at the beginning of the request).\r\n if (this.transferred_ !== old) {\r\n this.notifyObservers_();\r\n }\r\n };\r\n UploadTask.prototype.transition_ = function (state) {\r\n if (this.state_ === state) {\r\n return;\r\n }\r\n switch (state) {\r\n case InternalTaskState.CANCELING:\r\n // TODO(andysoto):\r\n // assert(this.state_ === InternalTaskState.RUNNING ||\r\n // this.state_ === InternalTaskState.PAUSING);\r\n this.state_ = state;\r\n if (this.request_ !== null) {\r\n this.request_.cancel();\r\n }\r\n break;\r\n case InternalTaskState.PAUSING:\r\n // TODO(andysoto):\r\n // assert(this.state_ === InternalTaskState.RUNNING);\r\n this.state_ = state;\r\n if (this.request_ !== null) {\r\n this.request_.cancel();\r\n }\r\n break;\r\n case InternalTaskState.RUNNING:\r\n // TODO(andysoto):\r\n // assert(this.state_ === InternalTaskState.PAUSED ||\r\n // this.state_ === InternalTaskState.PAUSING);\r\n var wasPaused = this.state_ === InternalTaskState.PAUSED;\r\n this.state_ = state;\r\n if (wasPaused) {\r\n this.notifyObservers_();\r\n this.start_();\r\n }\r\n break;\r\n case InternalTaskState.PAUSED:\r\n // TODO(andysoto):\r\n // assert(this.state_ === InternalTaskState.PAUSING);\r\n this.state_ = state;\r\n this.notifyObservers_();\r\n break;\r\n case InternalTaskState.CANCELED:\r\n // TODO(andysoto):\r\n // assert(this.state_ === InternalTaskState.PAUSED ||\r\n // this.state_ === InternalTaskState.CANCELING);\r\n this.error_ = canceled();\r\n this.state_ = state;\r\n this.notifyObservers_();\r\n break;\r\n case InternalTaskState.ERROR:\r\n // TODO(andysoto):\r\n // assert(this.state_ === InternalTaskState.RUNNING ||\r\n // this.state_ === InternalTaskState.PAUSING ||\r\n // this.state_ === InternalTaskState.CANCELING);\r\n this.state_ = state;\r\n this.notifyObservers_();\r\n break;\r\n case InternalTaskState.SUCCESS:\r\n // TODO(andysoto):\r\n // assert(this.state_ === InternalTaskState.RUNNING ||\r\n // this.state_ === InternalTaskState.PAUSING ||\r\n // this.state_ === InternalTaskState.CANCELING);\r\n this.state_ = state;\r\n this.notifyObservers_();\r\n break;\r\n }\r\n };\r\n UploadTask.prototype.completeTransitions_ = function () {\r\n switch (this.state_) {\r\n case InternalTaskState.PAUSING:\r\n this.transition_(InternalTaskState.PAUSED);\r\n break;\r\n case InternalTaskState.CANCELING:\r\n this.transition_(InternalTaskState.CANCELED);\r\n break;\r\n case InternalTaskState.RUNNING:\r\n this.start_();\r\n break;\r\n default:\r\n // TODO(andysoto): assert(false);\r\n break;\r\n }\r\n };\r\n Object.defineProperty(UploadTask.prototype, \"snapshot\", {\r\n get: function () {\r\n var externalState = taskStateFromInternalTaskState(this.state_);\r\n return new UploadTaskSnapshot(this.transferred_, this.blob_.size(), externalState, this.metadata_, this, this.ref_);\r\n },\r\n enumerable: true,\r\n configurable: true\r\n });\r\n /**\r\n * Adds a callback for an event.\r\n * @param type The type of event to listen for.\r\n */\r\n UploadTask.prototype.on = function (type, nextOrObserver, error, completed) {\r\n if (nextOrObserver === void 0) { nextOrObserver = undefined; }\r\n if (error === void 0) { error = undefined; }\r\n if (completed === void 0) { completed = undefined; }\r\n function typeValidator(_p) {\r\n if (type !== TaskEvent.STATE_CHANGED) {\r\n throw \"Expected one of the event types: [\" + TaskEvent.STATE_CHANGED + \"].\";\r\n }\r\n }\r\n var nextOrObserverMessage = 'Expected a function or an Object with one of ' +\r\n '`next`, `error`, `complete` properties.';\r\n var nextValidator = nullFunctionSpec(true).validator;\r\n var observerValidator = looseObjectSpec(null, true).validator;\r\n function nextOrObserverValidator(p) {\r\n try {\r\n nextValidator(p);\r\n return;\r\n }\r\n catch (e) { }\r\n try {\r\n observerValidator(p);\r\n var anyDefined = isJustDef(p['next']) ||\r\n isJustDef(p['error']) ||\r\n isJustDef(p['complete']);\r\n if (!anyDefined) {\r\n throw '';\r\n }\r\n return;\r\n }\r\n catch (e) {\r\n throw nextOrObserverMessage;\r\n }\r\n }\r\n var specs = [\r\n stringSpec(typeValidator),\r\n looseObjectSpec(nextOrObserverValidator, true),\r\n nullFunctionSpec(true),\r\n nullFunctionSpec(true)\r\n ];\r\n validate('on', specs, arguments);\r\n var self = this;\r\n function makeBinder(specs) {\r\n function binder(nextOrObserver, error, opt_complete) {\r\n if (specs !== null) {\r\n validate('on', specs, arguments);\r\n }\r\n var observer = new Observer(nextOrObserver, error, completed);\r\n self.addObserver_(observer);\r\n return function () {\r\n self.removeObserver_(observer);\r\n };\r\n }\r\n return binder;\r\n }\r\n function binderNextOrObserverValidator(p) {\r\n if (p === null) {\r\n throw nextOrObserverMessage;\r\n }\r\n nextOrObserverValidator(p);\r\n }\r\n var binderSpecs = [\r\n looseObjectSpec(binderNextOrObserverValidator),\r\n nullFunctionSpec(true),\r\n nullFunctionSpec(true)\r\n ];\r\n var typeOnly = !(isJustDef(nextOrObserver) ||\r\n isJustDef(error) ||\r\n isJustDef(completed));\r\n if (typeOnly) {\r\n return makeBinder(binderSpecs);\r\n }\r\n else {\r\n return makeBinder(null)(nextOrObserver, error, completed);\r\n }\r\n };\r\n /**\r\n * This object behaves like a Promise, and resolves with its snapshot data\r\n * when the upload completes.\r\n * @param onFulfilled The fulfillment callback. Promise chaining works as normal.\r\n * @param onRejected The rejection callback.\r\n */\r\n UploadTask.prototype.then = function (onFulfilled, onRejected) {\r\n // These casts are needed so that TypeScript can infer the types of the\r\n // resulting Promise.\r\n return this.promise_.then(onFulfilled, onRejected);\r\n };\r\n /**\r\n * Equivalent to calling `then(null, onRejected)`.\r\n */\r\n UploadTask.prototype.catch = function (onRejected) {\r\n return this.then(null, onRejected);\r\n };\r\n /**\r\n * Adds the given observer.\r\n */\r\n UploadTask.prototype.addObserver_ = function (observer) {\r\n this.observers_.push(observer);\r\n this.notifyObserver_(observer);\r\n };\r\n /**\r\n * Removes the given observer.\r\n */\r\n UploadTask.prototype.removeObserver_ = function (observer) {\r\n remove(this.observers_, observer);\r\n };\r\n UploadTask.prototype.notifyObservers_ = function () {\r\n var _this = this;\r\n this.finishPromise_();\r\n var observers = clone$1(this.observers_);\r\n observers.forEach(function (observer) {\r\n _this.notifyObserver_(observer);\r\n });\r\n };\r\n UploadTask.prototype.finishPromise_ = function () {\r\n if (this.resolve_ !== null) {\r\n var triggered = true;\r\n switch (taskStateFromInternalTaskState(this.state_)) {\r\n case TaskState.SUCCESS:\r\n async(this.resolve_.bind(null, this.snapshot))();\r\n break;\r\n case TaskState.CANCELED:\r\n case TaskState.ERROR:\r\n var toCall = this.reject_;\r\n async(toCall.bind(null, this.error_))();\r\n break;\r\n default:\r\n triggered = false;\r\n break;\r\n }\r\n if (triggered) {\r\n this.resolve_ = null;\r\n this.reject_ = null;\r\n }\r\n }\r\n };\r\n UploadTask.prototype.notifyObserver_ = function (observer) {\r\n var externalState = taskStateFromInternalTaskState(this.state_);\r\n switch (externalState) {\r\n case TaskState.RUNNING:\r\n case TaskState.PAUSED:\r\n if (observer.next !== null) {\r\n async(observer.next.bind(observer, this.snapshot))();\r\n }\r\n break;\r\n case TaskState.SUCCESS:\r\n if (observer.complete !== null) {\r\n async(observer.complete.bind(observer))();\r\n }\r\n break;\r\n case TaskState.CANCELED:\r\n case TaskState.ERROR:\r\n if (observer.error !== null) {\r\n async(observer.error.bind(observer, this.error_))();\r\n }\r\n break;\r\n default:\r\n // TODO(andysoto): assert(false);\r\n if (observer.error !== null) {\r\n async(observer.error.bind(observer, this.error_))();\r\n }\r\n }\r\n };\r\n /**\r\n * Resumes a paused task. Has no effect on a currently running or failed task.\r\n * @return True if the operation took effect, false if ignored.\r\n */\r\n UploadTask.prototype.resume = function () {\r\n validate('resume', [], arguments);\r\n var valid = this.state_ === InternalTaskState.PAUSED ||\r\n this.state_ === InternalTaskState.PAUSING;\r\n if (valid) {\r\n this.transition_(InternalTaskState.RUNNING);\r\n }\r\n return valid;\r\n };\r\n /**\r\n * Pauses a currently running task. Has no effect on a paused or failed task.\r\n * @return True if the operation took effect, false if ignored.\r\n */\r\n UploadTask.prototype.pause = function () {\r\n validate('pause', [], arguments);\r\n var valid = this.state_ === InternalTaskState.RUNNING;\r\n if (valid) {\r\n this.transition_(InternalTaskState.PAUSING);\r\n }\r\n return valid;\r\n };\r\n /**\r\n * Cancels a currently running or paused task. Has no effect on a complete or\r\n * failed task.\r\n * @return True if the operation took effect, false if ignored.\r\n */\r\n UploadTask.prototype.cancel = function () {\r\n validate('cancel', [], arguments);\r\n var valid = this.state_ === InternalTaskState.RUNNING ||\r\n this.state_ === InternalTaskState.PAUSING;\r\n if (valid) {\r\n this.transition_(InternalTaskState.CANCELING);\r\n }\r\n return valid;\r\n };\r\n return UploadTask;\r\n}());\n\n/**\r\n * @license\r\n * Copyright 2017 Google Inc.\r\n *\r\n * Licensed under the Apache License, Version 2.0 (the \"License\");\r\n * you may not use this file except in compliance with the License.\r\n * You may obtain a copy of the License at\r\n *\r\n * http://www.apache.org/licenses/LICENSE-2.0\r\n *\r\n * Unless required by applicable law or agreed to in writing, software\r\n * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n * See the License for the specific language governing permissions and\r\n * limitations under the License.\r\n */\r\n/**\r\n * Provides methods to interact with a bucket in the Firebase Storage service.\r\n * @param location An fbs.location, or the URL at\r\n * which to base this object, in one of the following forms:\r\n * gs:///\r\n * http[s]://firebasestorage.googleapis.com/\r\n * /b//o/\r\n * Any query or fragment strings will be ignored in the http[s]\r\n * format. If no value is passed, the storage object will use a URL based on\r\n * the project ID of the base firebase.App instance.\r\n */\r\nvar Reference = /** @class */ (function () {\r\n function Reference(authWrapper, location) {\r\n this.authWrapper = authWrapper;\r\n if (location instanceof Location) {\r\n this.location = location;\r\n }\r\n else {\r\n this.location = Location.makeFromUrl(location);\r\n }\r\n }\r\n /**\r\n * @return The URL for the bucket and path this object references,\r\n * in the form gs:///\r\n * @override\r\n */\r\n Reference.prototype.toString = function () {\r\n validate('toString', [], arguments);\r\n return 'gs://' + this.location.bucket + '/' + this.location.path;\r\n };\r\n Reference.prototype.newRef = function (authWrapper, location) {\r\n return new Reference(authWrapper, location);\r\n };\r\n Reference.prototype.mappings = function () {\r\n return getMappings();\r\n };\r\n /**\r\n * @return A reference to the object obtained by\r\n * appending childPath, removing any duplicate, beginning, or trailing\r\n * slashes.\r\n */\r\n Reference.prototype.child = function (childPath) {\r\n validate('child', [stringSpec()], arguments);\r\n var newPath = child(this.location.path, childPath);\r\n var location = new Location(this.location.bucket, newPath);\r\n return this.newRef(this.authWrapper, location);\r\n };\r\n Object.defineProperty(Reference.prototype, \"parent\", {\r\n /**\r\n * @return A reference to the parent of the\r\n * current object, or null if the current object is the root.\r\n */\r\n get: function () {\r\n var newPath = parent(this.location.path);\r\n if (newPath === null) {\r\n return null;\r\n }\r\n var location = new Location(this.location.bucket, newPath);\r\n return this.newRef(this.authWrapper, location);\r\n },\r\n enumerable: true,\r\n configurable: true\r\n });\r\n Object.defineProperty(Reference.prototype, \"root\", {\r\n /**\r\n * @return An reference to the root of this\r\n * object's bucket.\r\n */\r\n get: function () {\r\n var location = new Location(this.location.bucket, '');\r\n return this.newRef(this.authWrapper, location);\r\n },\r\n enumerable: true,\r\n configurable: true\r\n });\r\n Object.defineProperty(Reference.prototype, \"bucket\", {\r\n get: function () {\r\n return this.location.bucket;\r\n },\r\n enumerable: true,\r\n configurable: true\r\n });\r\n Object.defineProperty(Reference.prototype, \"fullPath\", {\r\n get: function () {\r\n return this.location.path;\r\n },\r\n enumerable: true,\r\n configurable: true\r\n });\r\n Object.defineProperty(Reference.prototype, \"name\", {\r\n get: function () {\r\n return lastComponent(this.location.path);\r\n },\r\n enumerable: true,\r\n configurable: true\r\n });\r\n Object.defineProperty(Reference.prototype, \"storage\", {\r\n get: function () {\r\n return this.authWrapper.service();\r\n },\r\n enumerable: true,\r\n configurable: true\r\n });\r\n /**\r\n * Uploads a blob to this object's location.\r\n * @param data The blob to upload.\r\n * @return An UploadTask that lets you control and\r\n * observe the upload.\r\n */\r\n Reference.prototype.put = function (data, metadata) {\r\n if (metadata === void 0) { metadata = null; }\r\n validate('put', [uploadDataSpec(), metadataSpec(true)], arguments);\r\n this.throwIfRoot_('put');\r\n return new UploadTask(this, this.authWrapper, this.location, this.mappings(), new FbsBlob(data), metadata);\r\n };\r\n /**\r\n * Uploads a string to this object's location.\r\n * @param string The string to upload.\r\n * @param opt_format The format of the string to upload.\r\n * @return An UploadTask that lets you control and\r\n * observe the upload.\r\n */\r\n Reference.prototype.putString = function (string, format, opt_metadata) {\r\n if (format === void 0) { format = StringFormat.RAW; }\r\n validate('putString', [\r\n stringSpec(),\r\n stringSpec(formatValidator, true),\r\n metadataSpec(true)\r\n ], arguments);\r\n this.throwIfRoot_('putString');\r\n var data = dataFromString(format, string);\r\n var metadata = clone(opt_metadata);\r\n if (!isDef(metadata['contentType']) && isDef(data.contentType)) {\r\n metadata['contentType'] = data.contentType;\r\n }\r\n return new UploadTask(this, this.authWrapper, this.location, this.mappings(), new FbsBlob(data.data, true), metadata);\r\n };\r\n /**\r\n * Deletes the object at this location.\r\n * @return A promise that resolves if the deletion succeeds.\r\n */\r\n Reference.prototype.delete = function () {\r\n validate('delete', [], arguments);\r\n this.throwIfRoot_('delete');\r\n var self = this;\r\n return this.authWrapper.getAuthToken().then(function (authToken) {\r\n var requestInfo = deleteObject(self.authWrapper, self.location);\r\n return self.authWrapper.makeRequest(requestInfo, authToken).getPromise();\r\n });\r\n };\r\n /**\r\n * A promise that resolves with the metadata for this object. If this\r\n * object doesn't exist or metadata cannot be retreived, the promise is\r\n * rejected.\r\n */\r\n Reference.prototype.getMetadata = function () {\r\n validate('getMetadata', [], arguments);\r\n this.throwIfRoot_('getMetadata');\r\n var self = this;\r\n return this.authWrapper.getAuthToken().then(function (authToken) {\r\n var requestInfo = getMetadata(self.authWrapper, self.location, self.mappings());\r\n return self.authWrapper.makeRequest(requestInfo, authToken).getPromise();\r\n });\r\n };\r\n /**\r\n * Updates the metadata for this object.\r\n * @param metadata The new metadata for the object.\r\n * Only values that have been explicitly set will be changed. Explicitly\r\n * setting a value to null will remove the metadata.\r\n * @return A promise that resolves\r\n * with the new metadata for this object.\r\n * @see firebaseStorage.Reference.prototype.getMetadata\r\n */\r\n Reference.prototype.updateMetadata = function (metadata) {\r\n validate('updateMetadata', [metadataSpec()], arguments);\r\n this.throwIfRoot_('updateMetadata');\r\n var self = this;\r\n return this.authWrapper.getAuthToken().then(function (authToken) {\r\n var requestInfo = updateMetadata(self.authWrapper, self.location, metadata, self.mappings());\r\n return self.authWrapper.makeRequest(requestInfo, authToken).getPromise();\r\n });\r\n };\r\n /**\r\n * @return A promise that resolves with the download\r\n * URL for this object.\r\n */\r\n Reference.prototype.getDownloadURL = function () {\r\n validate('getDownloadURL', [], arguments);\r\n this.throwIfRoot_('getDownloadURL');\r\n var self = this;\r\n return this.authWrapper.getAuthToken().then(function (authToken) {\r\n var requestInfo = getDownloadUrl(self.authWrapper, self.location, self.mappings());\r\n return self.authWrapper\r\n .makeRequest(requestInfo, authToken)\r\n .getPromise()\r\n .then(function (url) {\r\n if (url === null) {\r\n throw noDownloadURL();\r\n }\r\n return url;\r\n });\r\n });\r\n };\r\n Reference.prototype.throwIfRoot_ = function (name) {\r\n if (this.location.path === '') {\r\n throw invalidRootOperation(name);\r\n }\r\n };\r\n return Reference;\r\n}());\n\n/**\r\n * A request whose promise always fails.\r\n * @struct\r\n * @template T\r\n */\r\nvar FailRequest = /** @class */ (function () {\r\n function FailRequest(error) {\r\n this.promise_ = reject(error);\r\n }\r\n /** @inheritDoc */\r\n FailRequest.prototype.getPromise = function () {\r\n return this.promise_;\r\n };\r\n /** @inheritDoc */\r\n FailRequest.prototype.cancel = function (appDelete) {\r\n if (appDelete === void 0) { appDelete = false; }\r\n };\r\n return FailRequest;\r\n}());\n\n/**\r\n * @license\r\n * Copyright 2017 Google Inc.\r\n *\r\n * Licensed under the Apache License, Version 2.0 (the \"License\");\r\n * you may not use this file except in compliance with the License.\r\n * You may obtain a copy of the License at\r\n *\r\n * http://www.apache.org/licenses/LICENSE-2.0\r\n *\r\n * Unless required by applicable law or agreed to in writing, software\r\n * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n * See the License for the specific language governing permissions and\r\n * limitations under the License.\r\n */\r\n/**\r\n * @struct\r\n */\r\nvar RequestMap = /** @class */ (function () {\r\n function RequestMap() {\r\n this.map_ = {};\r\n this.id_ = minSafeInteger;\r\n }\r\n /**\r\n * Registers the given request with this map.\r\n * The request is unregistered when it completes.\r\n * @param r The request to register.\r\n */\r\n RequestMap.prototype.addRequest = function (r) {\r\n var id = this.id_;\r\n this.id_++;\r\n this.map_[id] = r;\r\n var self = this;\r\n function unmap() {\r\n delete self.map_[id];\r\n }\r\n r.getPromise().then(unmap, unmap);\r\n };\r\n /**\r\n * Cancels all registered requests.\r\n */\r\n RequestMap.prototype.clear = function () {\r\n forEach(this.map_, function (key, val) {\r\n if (val) {\r\n val.cancel(true);\r\n }\r\n });\r\n this.map_ = {};\r\n };\r\n return RequestMap;\r\n}());\n\n/**\r\n * @param app If null, getAuthToken always resolves with null.\r\n * @param service The storage service associated with this auth wrapper.\r\n * Untyped to avoid circular type dependencies.\r\n * @struct\r\n */\r\nvar AuthWrapper = /** @class */ (function () {\r\n function AuthWrapper(app, maker, requestMaker, service, pool) {\r\n this.bucket_ = null;\r\n this.deleted_ = false;\r\n this.app_ = app;\r\n if (this.app_ !== null) {\r\n var options = this.app_.options;\r\n if (isDef(options)) {\r\n this.bucket_ = AuthWrapper.extractBucket_(options);\r\n }\r\n }\r\n this.storageRefMaker_ = maker;\r\n this.requestMaker_ = requestMaker;\r\n this.pool_ = pool;\r\n this.service_ = service;\r\n this.maxOperationRetryTime_ = defaultMaxOperationRetryTime;\r\n this.maxUploadRetryTime_ = defaultMaxUploadRetryTime;\r\n this.requestMap_ = new RequestMap();\r\n }\r\n AuthWrapper.extractBucket_ = function (config) {\r\n var bucketString = config[configOption] || null;\r\n if (bucketString == null) {\r\n return null;\r\n }\r\n var loc = Location.makeFromBucketSpec(bucketString);\r\n return loc.bucket;\r\n };\r\n AuthWrapper.prototype.getAuthToken = function () {\r\n // TODO(andysoto): remove ifDef checks after firebase-app implements stubs\r\n // (b/28673818).\r\n if (this.app_ !== null &&\r\n isDef(this.app_.INTERNAL) &&\r\n isDef(this.app_.INTERNAL.getToken)) {\r\n return this.app_.INTERNAL.getToken().then(function (response) {\r\n if (response !== null) {\r\n return response.accessToken;\r\n }\r\n else {\r\n return null;\r\n }\r\n }, function (_error) {\r\n return null;\r\n });\r\n }\r\n else {\r\n return resolve(null);\r\n }\r\n };\r\n AuthWrapper.prototype.bucket = function () {\r\n if (this.deleted_) {\r\n throw appDeleted();\r\n }\r\n else {\r\n return this.bucket_;\r\n }\r\n };\r\n /**\r\n * The service associated with this auth wrapper. Untyped to avoid circular\r\n * type dependencies.\r\n */\r\n AuthWrapper.prototype.service = function () {\r\n return this.service_;\r\n };\r\n /**\r\n * Returns a new firebaseStorage.Reference object referencing this AuthWrapper\r\n * at the given Location.\r\n * @param loc The Location.\r\n * @return Actually a firebaseStorage.Reference, typing not allowed\r\n * because of circular dependency problems.\r\n */\r\n AuthWrapper.prototype.makeStorageReference = function (loc) {\r\n return this.storageRefMaker_(this, loc);\r\n };\r\n AuthWrapper.prototype.makeRequest = function (requestInfo, authToken) {\r\n if (!this.deleted_) {\r\n var request = this.requestMaker_(requestInfo, authToken, this.pool_);\r\n this.requestMap_.addRequest(request);\r\n return request;\r\n }\r\n else {\r\n return new FailRequest(appDeleted());\r\n }\r\n };\r\n /**\r\n * Stop running requests and prevent more from being created.\r\n */\r\n AuthWrapper.prototype.deleteApp = function () {\r\n this.deleted_ = true;\r\n this.app_ = null;\r\n this.requestMap_.clear();\r\n };\r\n AuthWrapper.prototype.maxUploadRetryTime = function () {\r\n return this.maxUploadRetryTime_;\r\n };\r\n AuthWrapper.prototype.setMaxUploadRetryTime = function (time) {\r\n this.maxUploadRetryTime_ = time;\r\n };\r\n AuthWrapper.prototype.maxOperationRetryTime = function () {\r\n return this.maxOperationRetryTime_;\r\n };\r\n AuthWrapper.prototype.setMaxOperationRetryTime = function (time) {\r\n this.maxOperationRetryTime_ = time;\r\n };\r\n return AuthWrapper;\r\n}());\n\n/**\r\n * @license\r\n * Copyright 2017 Google Inc.\r\n *\r\n * Licensed under the Apache License, Version 2.0 (the \"License\");\r\n * you may not use this file except in compliance with the License.\r\n * You may obtain a copy of the License at\r\n *\r\n * http://www.apache.org/licenses/LICENSE-2.0\r\n *\r\n * Unless required by applicable law or agreed to in writing, software\r\n * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n * See the License for the specific language governing permissions and\r\n * limitations under the License.\r\n */\r\n/**\r\n * @param f May be invoked\r\n * before the function returns.\r\n * @param callback Get all the arguments passed to the function\r\n * passed to f, including the initial boolean.\r\n */\r\nfunction start(f, callback, timeout) {\r\n // TODO(andysoto): make this code cleaner (probably refactor into an actual\r\n // type instead of a bunch of functions with state shared in the closure)\r\n var waitSeconds = 1;\r\n // Would type this as \"number\" but that doesn't work for Node so ¯\\_(ツ)_/¯\r\n var timeoutId = null;\r\n var hitTimeout = false;\r\n var cancelState = 0;\r\n function canceled() {\r\n return cancelState === 2;\r\n }\r\n var triggeredCallback = false;\r\n function triggerCallback() {\r\n if (!triggeredCallback) {\r\n triggeredCallback = true;\r\n callback.apply(null, arguments);\r\n }\r\n }\r\n function callWithDelay(millis) {\r\n timeoutId = setTimeout(function () {\r\n timeoutId = null;\r\n f(handler, canceled());\r\n }, millis);\r\n }\r\n function handler(success) {\r\n var var_args = [];\r\n for (var _i = 1; _i < arguments.length; _i++) {\r\n var_args[_i - 1] = arguments[_i];\r\n }\r\n if (triggeredCallback) {\r\n return;\r\n }\r\n if (success) {\r\n triggerCallback.apply(null, arguments);\r\n return;\r\n }\r\n var mustStop = canceled() || hitTimeout;\r\n if (mustStop) {\r\n triggerCallback.apply(null, arguments);\r\n return;\r\n }\r\n if (waitSeconds < 64) {\r\n /* TODO(andysoto): don't back off so quickly if we know we're offline. */\r\n waitSeconds *= 2;\r\n }\r\n var waitMillis;\r\n if (cancelState === 1) {\r\n cancelState = 2;\r\n waitMillis = 0;\r\n }\r\n else {\r\n waitMillis = (waitSeconds + Math.random()) * 1000;\r\n }\r\n callWithDelay(waitMillis);\r\n }\r\n var stopped = false;\r\n function stop(wasTimeout) {\r\n if (stopped) {\r\n return;\r\n }\r\n stopped = true;\r\n if (triggeredCallback) {\r\n return;\r\n }\r\n if (timeoutId !== null) {\r\n if (!wasTimeout) {\r\n cancelState = 2;\r\n }\r\n clearTimeout(timeoutId);\r\n callWithDelay(0);\r\n }\r\n else {\r\n if (!wasTimeout) {\r\n cancelState = 1;\r\n }\r\n }\r\n }\r\n callWithDelay(0);\r\n setTimeout(function () {\r\n hitTimeout = true;\r\n stop(true);\r\n }, timeout);\r\n return stop;\r\n}\r\n/**\r\n * Stops the retry loop from repeating.\r\n * If the function is currently \"in between\" retries, it is invoked immediately\r\n * with the second parameter as \"true\". Otherwise, it will be invoked once more\r\n * after the current invocation finishes iff the current invocation would have\r\n * triggered another retry.\r\n */\r\nfunction stop(id) {\r\n id(false);\r\n}\n\n/**\r\n * @license\r\n * Copyright 2017 Google Inc.\r\n *\r\n * Licensed under the Apache License, Version 2.0 (the \"License\");\r\n * you may not use this file except in compliance with the License.\r\n * You may obtain a copy of the License at\r\n *\r\n * http://www.apache.org/licenses/LICENSE-2.0\r\n *\r\n * Unless required by applicable law or agreed to in writing, software\r\n * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n * See the License for the specific language governing permissions and\r\n * limitations under the License.\r\n */\r\n/**\r\n * @struct\r\n * @template T\r\n */\r\nvar NetworkRequest = /** @class */ (function () {\r\n function NetworkRequest(url, method, headers, body, successCodes, additionalRetryCodes, callback, errorCallback, timeout, progressCallback, pool) {\r\n this.pendingXhr_ = null;\r\n this.backoffId_ = null;\r\n this.resolve_ = null;\r\n this.reject_ = null;\r\n this.canceled_ = false;\r\n this.appDelete_ = false;\r\n this.url_ = url;\r\n this.method_ = method;\r\n this.headers_ = headers;\r\n this.body_ = body;\r\n this.successCodes_ = successCodes.slice();\r\n this.additionalRetryCodes_ = additionalRetryCodes.slice();\r\n this.callback_ = callback;\r\n this.errorCallback_ = errorCallback;\r\n this.progressCallback_ = progressCallback;\r\n this.timeout_ = timeout;\r\n this.pool_ = pool;\r\n var self = this;\r\n this.promise_ = make(function (resolve, reject) {\r\n self.resolve_ = resolve;\r\n self.reject_ = reject;\r\n self.start_();\r\n });\r\n }\r\n /**\r\n * Actually starts the retry loop.\r\n */\r\n NetworkRequest.prototype.start_ = function () {\r\n var self = this;\r\n function doTheRequest(backoffCallback, canceled) {\r\n if (canceled) {\r\n backoffCallback(false, new RequestEndStatus(false, null, true));\r\n return;\r\n }\r\n var xhr = self.pool_.createXhrIo();\r\n self.pendingXhr_ = xhr;\r\n function progressListener(progressEvent) {\r\n var loaded = progressEvent.loaded;\r\n var total = progressEvent.lengthComputable ? progressEvent.total : -1;\r\n if (self.progressCallback_ !== null) {\r\n self.progressCallback_(loaded, total);\r\n }\r\n }\r\n if (self.progressCallback_ !== null) {\r\n xhr.addUploadProgressListener(progressListener);\r\n }\r\n xhr\r\n .send(self.url_, self.method_, self.body_, self.headers_)\r\n .then(function (xhr) {\r\n if (self.progressCallback_ !== null) {\r\n xhr.removeUploadProgressListener(progressListener);\r\n }\r\n self.pendingXhr_ = null;\r\n xhr = xhr;\r\n var hitServer = xhr.getErrorCode() === ErrorCode.NO_ERROR;\r\n var status = xhr.getStatus();\r\n if (!hitServer || self.isRetryStatusCode_(status)) {\r\n var wasCanceled = xhr.getErrorCode() === ErrorCode.ABORT;\r\n backoffCallback(false, new RequestEndStatus(false, null, wasCanceled));\r\n return;\r\n }\r\n var successCode = contains$1(self.successCodes_, status);\r\n backoffCallback(true, new RequestEndStatus(successCode, xhr));\r\n });\r\n }\r\n /**\r\n * @param requestWentThrough True if the request eventually went\r\n * through, false if it hit the retry limit or was canceled.\r\n */\r\n function backoffDone(requestWentThrough, status) {\r\n var resolve = self.resolve_;\r\n var reject = self.reject_;\r\n var xhr = status.xhr;\r\n if (status.wasSuccessCode) {\r\n try {\r\n var result = self.callback_(xhr, xhr.getResponseText());\r\n if (isJustDef(result)) {\r\n resolve(result);\r\n }\r\n else {\r\n resolve();\r\n }\r\n }\r\n catch (e) {\r\n reject(e);\r\n }\r\n }\r\n else {\r\n if (xhr !== null) {\r\n var err = unknown();\r\n err.setServerResponseProp(xhr.getResponseText());\r\n if (self.errorCallback_) {\r\n reject(self.errorCallback_(xhr, err));\r\n }\r\n else {\r\n reject(err);\r\n }\r\n }\r\n else {\r\n if (status.canceled) {\r\n var err = self.appDelete_\r\n ? appDeleted()\r\n : canceled();\r\n reject(err);\r\n }\r\n else {\r\n var err = retryLimitExceeded();\r\n reject(err);\r\n }\r\n }\r\n }\r\n }\r\n if (this.canceled_) {\r\n backoffDone(false, new RequestEndStatus(false, null, true));\r\n }\r\n else {\r\n this.backoffId_ = start(doTheRequest, backoffDone, this.timeout_);\r\n }\r\n };\r\n /** @inheritDoc */\r\n NetworkRequest.prototype.getPromise = function () {\r\n return this.promise_;\r\n };\r\n /** @inheritDoc */\r\n NetworkRequest.prototype.cancel = function (appDelete) {\r\n this.canceled_ = true;\r\n this.appDelete_ = appDelete || false;\r\n if (this.backoffId_ !== null) {\r\n stop(this.backoffId_);\r\n }\r\n if (this.pendingXhr_ !== null) {\r\n this.pendingXhr_.abort();\r\n }\r\n };\r\n NetworkRequest.prototype.isRetryStatusCode_ = function (status) {\r\n // The codes for which to retry came from this page:\r\n // https://cloud.google.com/storage/docs/exponential-backoff\r\n var isFiveHundredCode = status >= 500 && status < 600;\r\n var extraRetryCodes = [\r\n // Request Timeout: web server didn't receive full request in time.\r\n 408,\r\n // Too Many Requests: you're getting rate-limited, basically.\r\n 429\r\n ];\r\n var isExtraRetryCode = contains$1(extraRetryCodes, status);\r\n var isRequestSpecificRetryCode = contains$1(this.additionalRetryCodes_, status);\r\n return isFiveHundredCode || isExtraRetryCode || isRequestSpecificRetryCode;\r\n };\r\n return NetworkRequest;\r\n}());\r\n/**\r\n * A collection of information about the result of a network request.\r\n * @param opt_canceled Defaults to false.\r\n * @struct\r\n */\r\nvar RequestEndStatus = /** @class */ (function () {\r\n function RequestEndStatus(wasSuccessCode, xhr, opt_canceled) {\r\n this.wasSuccessCode = wasSuccessCode;\r\n this.xhr = xhr;\r\n this.canceled = !!opt_canceled;\r\n }\r\n return RequestEndStatus;\r\n}());\r\nfunction addAuthHeader_(headers, authToken) {\r\n if (authToken !== null && authToken.length > 0) {\r\n headers['Authorization'] = 'Firebase ' + authToken;\r\n }\r\n}\r\nfunction addVersionHeader_(headers) {\r\n var number = typeof firebase !== 'undefined' ? firebase.SDK_VERSION : 'AppManager';\r\n headers['X-Firebase-Storage-Version'] = 'webjs/' + number;\r\n}\r\n/**\r\n * @template T\r\n */\r\nfunction makeRequest(requestInfo, authToken, pool) {\r\n var queryPart = makeQueryString(requestInfo.urlParams);\r\n var url = requestInfo.url + queryPart;\r\n var headers = clone(requestInfo.headers);\r\n addAuthHeader_(headers, authToken);\r\n addVersionHeader_(headers);\r\n return new NetworkRequest(url, requestInfo.method, headers, requestInfo.body, requestInfo.successCodes, requestInfo.additionalRetryCodes, requestInfo.handler, requestInfo.errorHandler, requestInfo.timeout, requestInfo.progressCallback, pool);\r\n}\n\n/**\r\n * @license\r\n * Copyright 2017 Google Inc.\r\n *\r\n * Licensed under the Apache License, Version 2.0 (the \"License\");\r\n * you may not use this file except in compliance with the License.\r\n * You may obtain a copy of the License at\r\n *\r\n * http://www.apache.org/licenses/LICENSE-2.0\r\n *\r\n * Unless required by applicable law or agreed to in writing, software\r\n * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n * See the License for the specific language governing permissions and\r\n * limitations under the License.\r\n */\r\n/**\r\n * A service that provides firebaseStorage.Reference instances.\r\n * @param opt_url gs:// url to a custom Storage Bucket\r\n *\r\n * @struct\r\n */\r\nvar Service = /** @class */ (function () {\r\n function Service(app, pool, url) {\r\n this.bucket_ = null;\r\n function maker(authWrapper, loc) {\r\n return new Reference(authWrapper, loc);\r\n }\r\n this.authWrapper_ = new AuthWrapper(app, maker, makeRequest, this, pool);\r\n this.app_ = app;\r\n if (url != null) {\r\n this.bucket_ = Location.makeFromBucketSpec(url);\r\n }\r\n else {\r\n var authWrapperBucket = this.authWrapper_.bucket();\r\n if (authWrapperBucket != null) {\r\n this.bucket_ = new Location(authWrapperBucket, '');\r\n }\r\n }\r\n this.internals_ = new ServiceInternals(this);\r\n }\r\n /**\r\n * Returns a firebaseStorage.Reference for the given path in the default\r\n * bucket.\r\n */\r\n Service.prototype.ref = function (path) {\r\n function validator(path) {\r\n if (/^[A-Za-z]+:\\/\\//.test(path)) {\r\n throw 'Expected child path but got a URL, use refFromURL instead.';\r\n }\r\n }\r\n validate('ref', [stringSpec(validator, true)], arguments);\r\n if (this.bucket_ == null) {\r\n throw new Error('No Storage Bucket defined in Firebase Options.');\r\n }\r\n var ref = new Reference(this.authWrapper_, this.bucket_);\r\n if (path != null) {\r\n return ref.child(path);\r\n }\r\n else {\r\n return ref;\r\n }\r\n };\r\n /**\r\n * Returns a firebaseStorage.Reference object for the given absolute URL,\r\n * which must be a gs:// or http[s]:// URL.\r\n */\r\n Service.prototype.refFromURL = function (url) {\r\n function validator(p) {\r\n if (!/^[A-Za-z]+:\\/\\//.test(p)) {\r\n throw 'Expected full URL but got a child path, use ref instead.';\r\n }\r\n try {\r\n Location.makeFromUrl(p);\r\n }\r\n catch (e) {\r\n throw 'Expected valid full URL but got an invalid one.';\r\n }\r\n }\r\n validate('refFromURL', [stringSpec(validator, false)], arguments);\r\n return new Reference(this.authWrapper_, url);\r\n };\r\n Object.defineProperty(Service.prototype, \"maxUploadRetryTime\", {\r\n get: function () {\r\n return this.authWrapper_.maxUploadRetryTime();\r\n },\r\n enumerable: true,\r\n configurable: true\r\n });\r\n Service.prototype.setMaxUploadRetryTime = function (time) {\r\n validate('setMaxUploadRetryTime', [nonNegativeNumberSpec()], arguments);\r\n this.authWrapper_.setMaxUploadRetryTime(time);\r\n };\r\n Object.defineProperty(Service.prototype, \"maxOperationRetryTime\", {\r\n get: function () {\r\n return this.authWrapper_.maxOperationRetryTime();\r\n },\r\n enumerable: true,\r\n configurable: true\r\n });\r\n Service.prototype.setMaxOperationRetryTime = function (time) {\r\n validate('setMaxOperationRetryTime', [nonNegativeNumberSpec()], arguments);\r\n this.authWrapper_.setMaxOperationRetryTime(time);\r\n };\r\n Object.defineProperty(Service.prototype, \"app\", {\r\n get: function () {\r\n return this.app_;\r\n },\r\n enumerable: true,\r\n configurable: true\r\n });\r\n Object.defineProperty(Service.prototype, \"INTERNAL\", {\r\n get: function () {\r\n return this.internals_;\r\n },\r\n enumerable: true,\r\n configurable: true\r\n });\r\n return Service;\r\n}());\r\n/**\r\n * @struct\r\n */\r\nvar ServiceInternals = /** @class */ (function () {\r\n function ServiceInternals(service) {\r\n this.service_ = service;\r\n }\r\n /**\r\n * Called when the associated app is deleted.\r\n * @see {!fbs.AuthWrapper.prototype.deleteApp}\r\n */\r\n ServiceInternals.prototype.delete = function () {\r\n this.service_.authWrapper_.deleteApp();\r\n return resolve(undefined);\r\n };\r\n return ServiceInternals;\r\n}());\n\n/**\r\n * @license\r\n * Copyright 2017 Google Inc.\r\n *\r\n * Licensed under the Apache License, Version 2.0 (the \"License\");\r\n * you may not use this file except in compliance with the License.\r\n * You may obtain a copy of the License at\r\n *\r\n * http://www.apache.org/licenses/LICENSE-2.0\r\n *\r\n * Unless required by applicable law or agreed to in writing, software\r\n * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n * See the License for the specific language governing permissions and\r\n * limitations under the License.\r\n */\r\n/**\r\n * Type constant for Firebase Storage.\r\n */\r\nvar STORAGE_TYPE = 'storage';\r\nfunction factory(app, unused, opt_url) {\r\n return new Service(app, new XhrIoPool(), opt_url);\r\n}\r\nfunction registerStorage(instance) {\r\n var namespaceExports = {\r\n // no-inline\r\n TaskState: TaskState,\r\n TaskEvent: TaskEvent,\r\n StringFormat: StringFormat,\r\n Storage: Service,\r\n Reference: Reference\r\n };\r\n instance.INTERNAL.registerService(STORAGE_TYPE, factory, namespaceExports, undefined, \r\n // Allow multiple storage instances per app.\r\n true);\r\n}\r\nregisterStorage(firebase);\n\nexport { registerStorage };\n"],"names":["domainBase","downloadBase","apiBaseUrl","apiUploadBaseUrl","FirebaseStorageError","code","message","this","code_","prependCode","message_","serverResponse_","name_","prototype","codeProp","codeEquals","serverResponseProp","setServerResponseProp","serverResponse","Object","defineProperty","get","enumerable","configurable","Code","UNKNOWN","OBJECT_NOT_FOUND","BUCKET_NOT_FOUND","PROJECT_NOT_FOUND","QUOTA_EXCEEDED","UNAUTHENTICATED","UNAUTHORIZED","RETRY_LIMIT_EXCEEDED","INVALID_CHECKSUM","CANCELED","INVALID_EVENT_NAME","INVALID_URL","INVALID_DEFAULT_BUCKET","NO_DEFAULT_BUCKET","CANNOT_SLICE_BLOB","SERVER_FILE_WRONG_SIZE","NO_DOWNLOAD_URL","INVALID_ARGUMENT","INVALID_ARGUMENT_COUNT","APP_DELETED","INVALID_ROOT_OPERATION","INVALID_FORMAT","INTERNAL_ERROR","unknown","canceled","cannotSliceBlob","invalidArgument","index","fnName","appDeleted","invalidFormat","format","internalError","StringFormat","RAW","BASE64","BASE64URL","DATA_URL","formatValidator","stringFormat","StringData","data","opt_contentType","contentType","dataFromString","string","utf8Bytes_","base64Bytes_","parts","DataURLParts","base64","rest","decoded","decodeURIComponent","e","percentEncodedBytes_","b","i","length","c","charCodeAt","push","Uint8Array","hasMinus","indexOf","hasUnder","hasPlus","hasSlash","replace","bytes","atob","array","dataURL","matches","match","s","end","middle","substring","ErrorCode","TaskEvent","STATE_CHANGED","InternalTaskState","TaskState","RUNNING","PAUSED","SUCCESS","ERROR","taskStateFromInternalTaskState","state","forEach","obj","f","key","prop","hasOwnProperty","call","clone","val","make","resolver","Promise","resolve","value","isDef","p","isJustDef","isFunction","isObject","isString","String","isNativeBlob","isNativeBlobDefined","Blob","NetworkXhrIo","_this","sent_","xhr_","XMLHttpRequest","errorCode_","NO_ERROR","sendPromise_","reject","addEventListener","event","ABORT","NETWORK_ERROR","send","url","method","opt_body","opt_headers","open","setRequestHeader","toString","getErrorCode","getStatus","status","getResponseText","responseText","abort","getResponseHeader","header","addUploadProgressListener","listener","upload","removeUploadProgressListener","removeEventListener","XhrIoPool","createXhrIo","jsonObjectOrNull","JSON","parse","Array","isArray","Location","bucket","path","path_","fullServerUrl","encode","encodeURIComponent","bucketOnlyServerUrl","makeFromBucketSpec","bucketString","bucketLocation","makeFromUrl","location","bucketDomain","groups","regex","RegExp","indices","postModify","loc","charAt","slice","group","captures","exec","bucketValue","pathValue","lastComponent","lastIndexOf","makeNormalUrl","urlPart","makeUploadUrl","makeQueryString","params","queryPart","nextPart","noXform_","metadata","Mapping","server","opt_local","opt_writable","opt_xform","local","writable","xform","mappings_","getMappings","mappings","nameMapping","fullPath","sizeMapping","size","fromResource","authWrapper","resource","type","len","mapping","makeStorageReference","fromResourceString","resourceString","downloadUrlFromResourceString","tokens","split","map","token","alt","toResourceString","stringify","metadataValidator","validate","name","specs","passed","minArgs","maxArgs","optional","argMin","argMax","real","countPart","plural","validator","Error","ArgSpec","opt_optional","self","stringSpec","opt_validator","stringValidator","v1","v2","metadataSpec","nonNegativeNumberSpec","Number","looseObjectSpec","nullFunctionSpec","getBlob","var_args","_i","arguments","BlobBuilder","WebKitBlobBuilder","undefined","bb","append","FbsBlob","opt_elideCopy","blobType","data_","ArrayBuffer","byteLength","set","size_","type_","startByte","endByte","realBlob","sliced","start","blob","webkitSlice","mozSlice","buffer","blobby","apply","uint8Arrays","finalLength_1","merged_1","index_1","uploadData","contains$1","elem","RequestInfo","handler","timeout","urlParams","headers","body","errorHandler","progressCallback","successCodes","additionalRetryCodes","handlerCheck","cndn","metadataHandler","xhr","text","sharedErrorHandler","err","newErr","objectErrorHandler","shared","getMetadata","maxOperationRetryTime","requestInfo","getDownloadUrl","metadataForUpload_","opt_metadata","ResumableUploadStatus","current","total","finalized","checkResumeHeader_","opt_allowed","continueResumableUpload","chunkSize","opt_status","opt_progressCallback","bytesLeft","bytesToUpload","Math","min","X-Goog-Upload-Command","X-Goog-Upload-Offset","maxUploadRetryTime","uploadStatus","newCurrent","Observer","nextOrObserver","opt_error","opt_complete","next","error","complete","observer","UploadTaskSnapshot","bytesTransferred","totalBytes","task","ref","async","argsToForward","then","UploadTask","transferred_","needToFetchStatus_","needToFetchMetadata_","observers_","error_","uploadUrl_","request_","chunkMultiplier_","resolve_","reject_","ref_","authWrapper_","location_","blob_","metadata_","resumable_","shouldDoResumable_","state_","errorHandler_","completeTransitions_","transition_","metadataErrorHandler_","promise_","start_","makeProgressCallback_","sizeBefore","loaded","updateProgress_","createResumable_","fetchStatus_","fetchMetadata_","continueUpload_","oneShotUpload_","resolveToken_","callback","getAuthToken","authToken","X-Goog-Upload-Protocol","X-Goog-Upload-Header-Content-Length","X-Goog-Upload-Header-Content-Type","Content-Type","createRequest","makeRequest","getPromise","sizeString","parseInt","isNaN","statusRequest","uploadRequest","newStatus","increaseMultiplier_","metadataRequest","boundary","str","random","genBoundary","preBlobPart","postBlobPart","multipartUpload","multipartRequest","transferred","old","notifyObservers_","cancel","wasPaused","externalState","on","completed","nextOrObserverMessage","nextValidator","observerValidator","nextOrObserverValidator","_p","makeBinder","addObserver_","removeObserver_","binderSpecs","onFulfilled","onRejected","catch","notifyObserver_","splice","arraylike","finishPromise_","triggered","bind","snapshot","resume","valid","pause","Reference","newRef","child","childPath","canonicalChildPath","newPath","filter","component","join","parent","service","put","throwIfRoot_","putString","delete","updateMetadata","getDownloadURL","FailRequest","appDelete","RequestMap","map_","id_","addRequest","r","id","unmap","clear","AuthWrapper","app","maker","requestMaker","pool","bucket_","deleted_","app_","options","extractBucket_","storageRefMaker_","requestMaker_","pool_","service_","maxOperationRetryTime_","maxUploadRetryTime_","requestMap_","config","INTERNAL","getToken","response","accessToken","_error","request","deleteApp","setMaxUploadRetryTime","time","setMaxOperationRetryTime","NetworkRequest","errorCallback","pendingXhr_","backoffId_","canceled_","appDelete_","url_","method_","headers_","body_","successCodes_","additionalRetryCodes_","callback_","errorCallback_","progressCallback_","timeout_","backoffDone","requestWentThrough","wasSuccessCode","result","RequestEndStatus","waitSeconds","timeoutId","hitTimeout","cancelState","triggeredCallback","triggerCallback","callWithDelay","millis","setTimeout","success","stopped","stop","wasTimeout","clearTimeout","backoffCallback","progressListener","hitServer","isRetryStatusCode_","successCode","wasCanceled","progressEvent","lengthComputable","isFiveHundredCode","isExtraRetryCode","isRequestSpecificRetryCode","opt_canceled","number","firebase","SDK_VERSION","namespaceExports","Service","authWrapperBucket","internals_","ServiceInternals","test","refFromURL","factory","unused","opt_url","Storage","registerService"],"mappings":"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"}