{"version":3,"file":"firebase-storage.js","sources":["../storage/dist/index.esm.js"],"sourcesContent":["import firebase from '@firebase/app';\n\n/**\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 * 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 * 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 * 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 * 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 * 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 * 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 * 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 * 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$$1, reject$$1) {\r\n _this.xhr_.addEventListener('abort', function (event) {\r\n _this.errorCode_ = ErrorCode.ABORT;\r\n resolve$$1(_this);\r\n });\r\n _this.xhr_.addEventListener('error', function (event) {\r\n _this.errorCode_ = ErrorCode.NETWORK_ERROR;\r\n resolve$$1(_this);\r\n });\r\n _this.xhr_.addEventListener('load', function (event) {\r\n resolve$$1(_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 * 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 * 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 * 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 * 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 * 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 * 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 * 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 * 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 * 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 * 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 * 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 * 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 * 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$$1, reject$$1) {\r\n _this.resolve_ = resolve$$1;\r\n _this.reject_ = reject$$1;\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 * 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 * 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 * 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 * 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$$1, reject$$1) {\r\n self.resolve_ = resolve$$1;\r\n self.reject_ = reject$$1;\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$$1) {\r\n if (canceled$$1) {\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$$1 = self.resolve_;\r\n var reject$$1 = 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$$1(result);\r\n }\r\n else {\r\n resolve$$1();\r\n }\r\n }\r\n catch (e) {\r\n reject$$1(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$$1(self.errorCallback_(xhr, err));\r\n }\r\n else {\r\n reject$$1(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$$1(err);\r\n }\r\n else {\r\n var err = retryLimitExceeded();\r\n reject$$1(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 * 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 * 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","defaultMaxOperationRetryTime","defaultMaxUploadRetryTime","minSafeInteger","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_","dataURLBytes_","dataURLContentType_","b","i","length","c","charCodeAt","push","Uint8Array","hasMinus","indexOf","hasUnder","hasPlus","hasSlash","replace","bytes","atob","array","dataURL","matches","match","middle","s","end","substring","ErrorCode","TaskEvent","STATE_CHANGED","InternalTaskState","RUNNING","PAUSING","PAUSED","SUCCESS","CANCELING","ERROR","TaskState","taskStateFromInternalTaskState","state","contains","obj","prop","hasOwnProperty","call","forEach","f","key","clone","val","make","resolver","Promise","resolve","value","isDef","p","isJustDef","isFunction","isObject","isNonNullObject","isString","String","isNativeBlob","isNativeBlobDefined","Blob","NetworkXhrIo","_this","sent_","xhr_","XMLHttpRequest","errorCode_","NO_ERROR","sendPromise_","resolve$$1","reject$$1","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","groups","regex","RegExp","indices","postModify","loc","charAt","slice","group","captures","exec","bucketValue","pathValue","invalidUrl","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","xformPath","sizeMapping","size","fromResource","authWrapper","resource","type","len","mapping","makeStorageReference","addRef","fromResourceString","resourceString","downloadUrlFromResourceString","tokens","split","map","token","makeDownloadUrl","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","isNumber","looseObjectSpec","undefined","nullFunctionSpec","getBlobBuilder","BlobBuilder","WebKitBlobBuilder","FbsBlob","opt_elideCopy","blobType","data_","ArrayBuffer","byteLength","set","size_","type_","startByte","endByte","realBlob","sliced","start","blob","webkitSlice","mozSlice","buffer","getBlob","var_args","_i","arguments","blobby","bb","append","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","downloadUrlHandler","metadataForUpload_","opt_metadata","determineContentType_","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","createResumableUpload","createRequest","makeRequest","getPromise","sizeString","parseInt","isNaN","getResumableUploadStatus","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","newPath","canonicalChildPath","filter","component","join","parent","service","put","throwIfRoot_","putString","delete","deleteObject","updateMetadata","getDownloadURL","invalidRootOperation","FailRequest","reject","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","waitMillis","stopped","stop","wasTimeout","clearTimeout","backoffCallback","canceled$$1","progressListener","hitServer","isRetryStatusCode_","successCode","wasCanceled","progressEvent","lengthComputable","isFiveHundredCode","isExtraRetryCode","isRequestSpecificRetryCode","opt_canceled","addAuthHeader_","number","firebase","SDK_VERSION","addVersionHeader_","namespaceExports","Service","authWrapperBucket","internals_","ServiceInternals","test","refFromURL","STORAGE_TYPE","factory","unused","opt_url","Storage","registerService"],"mappings":"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"}