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