From 928e33e54e93f8d5f35a4e6186a6457c75c0494f Mon Sep 17 00:00:00 2001 From: Maneesh Tewani Date: Fri, 20 Jan 2023 13:14:41 -0800 Subject: [PATCH 01/14] WIP --- packages/storage/src/implementation/error.ts | 24 -------------------- 1 file changed, 24 deletions(-) diff --git a/packages/storage/src/implementation/error.ts b/packages/storage/src/implementation/error.ts index da90e3900ee..09fe7255f15 100644 --- a/packages/storage/src/implementation/error.ts +++ b/packages/storage/src/implementation/error.ts @@ -25,50 +25,27 @@ import { CONFIG_STORAGE_BUCKET_KEY } from './constants'; */ export class StorageError extends FirebaseError { private readonly _baseMessage: string; - /** - * Stores custom error data unque to StorageError. - */ customData: { serverResponse: string | null } = { serverResponse: null }; - - /** - * @param code - A StorageErrorCode string to be prefixed with 'storage/' and - * added to the end of the message. - * @param message - Error message. - * @param status_ - Corresponding HTTP Status Code - */ constructor(code: StorageErrorCode, message: string, private status_ = 0) { super( prependCode(code), `Firebase Storage: ${message} (${prependCode(code)})` ); this._baseMessage = this.message; - // Without this, `instanceof StorageError`, in tests for example, - // returns false. Object.setPrototypeOf(this, StorageError.prototype); } - get status(): number { return this.status_; } - set status(status: number) { this.status_ = status; } - - /** - * Compares a StorageErrorCode against this error's code, filtering out the prefix. - */ _codeEquals(code: StorageErrorCode): boolean { return prependCode(code) === this.code; } - - /** - * Optional response message that was added by the server. - */ get serverResponse(): null | string { return this.customData.serverResponse; } - set serverResponse(serverResponse: string | null) { this.customData.serverResponse = serverResponse; if (this.customData.serverResponse) { @@ -78,7 +55,6 @@ export class StorageError extends FirebaseError { } } } - export const errors = {}; /** From 1095d7b691912f37c1013ab3547a043115990483 Mon Sep 17 00:00:00 2001 From: Maneesh Tewani Date: Tue, 24 Jan 2023 10:31:09 -0800 Subject: [PATCH 02/14] Added class StorageError as export --- packages/storage/src/implementation/error.ts | 24 ++++++++++++++++++++ packages/storage/src/public-types.ts | 14 +++--------- 2 files changed, 27 insertions(+), 11 deletions(-) diff --git a/packages/storage/src/implementation/error.ts b/packages/storage/src/implementation/error.ts index 09fe7255f15..da90e3900ee 100644 --- a/packages/storage/src/implementation/error.ts +++ b/packages/storage/src/implementation/error.ts @@ -25,27 +25,50 @@ import { CONFIG_STORAGE_BUCKET_KEY } from './constants'; */ export class StorageError extends FirebaseError { private readonly _baseMessage: string; + /** + * Stores custom error data unque to StorageError. + */ customData: { serverResponse: string | null } = { serverResponse: null }; + + /** + * @param code - A StorageErrorCode string to be prefixed with 'storage/' and + * added to the end of the message. + * @param message - Error message. + * @param status_ - Corresponding HTTP Status Code + */ constructor(code: StorageErrorCode, message: string, private status_ = 0) { super( prependCode(code), `Firebase Storage: ${message} (${prependCode(code)})` ); this._baseMessage = this.message; + // Without this, `instanceof StorageError`, in tests for example, + // returns false. Object.setPrototypeOf(this, StorageError.prototype); } + get status(): number { return this.status_; } + set status(status: number) { this.status_ = status; } + + /** + * Compares a StorageErrorCode against this error's code, filtering out the prefix. + */ _codeEquals(code: StorageErrorCode): boolean { return prependCode(code) === this.code; } + + /** + * Optional response message that was added by the server. + */ get serverResponse(): null | string { return this.customData.serverResponse; } + set serverResponse(serverResponse: string | null) { this.customData.serverResponse = serverResponse; if (this.customData.serverResponse) { @@ -55,6 +78,7 @@ export class StorageError extends FirebaseError { } } } + export const errors = {}; /** diff --git a/packages/storage/src/public-types.ts b/packages/storage/src/public-types.ts index 8aeb3c4e5f0..d34532dc419 100644 --- a/packages/storage/src/public-types.ts +++ b/packages/storage/src/public-types.ts @@ -19,11 +19,13 @@ import { FirebaseApp, _FirebaseService } from '@firebase/app'; import { CompleteFn, - FirebaseError, NextFn, Subscribe, Unsubscribe } from '@firebase/util'; +import { StorageError } from './implementation/error'; + +export { StorageError } from './implementation/error'; /** * A Firebase Storage instance. @@ -249,16 +251,6 @@ export type TaskEvent = 'state_changed'; */ export type TaskState = 'running' | 'paused' | 'success' | 'canceled' | 'error'; -/** - * An error returned by the Firebase Storage SDK. - * @public - */ -export interface StorageError extends FirebaseError { - /** - * A server response message for the error, if applicable. - */ - serverResponse: string | null; -} /** * A stream observer for Firebase Storage. From 9eedf81ceef72e3d33d30cd118e794608f88d03c Mon Sep 17 00:00:00 2001 From: Maneesh Tewani Date: Tue, 24 Jan 2023 10:41:24 -0800 Subject: [PATCH 03/14] Fixed formattign --- packages/storage/src/public-types.ts | 8 +------- 1 file changed, 1 insertion(+), 7 deletions(-) diff --git a/packages/storage/src/public-types.ts b/packages/storage/src/public-types.ts index d34532dc419..2c67d87cc8b 100644 --- a/packages/storage/src/public-types.ts +++ b/packages/storage/src/public-types.ts @@ -17,12 +17,7 @@ // eslint-disable-next-line import/no-extraneous-dependencies import { FirebaseApp, _FirebaseService } from '@firebase/app'; -import { - CompleteFn, - NextFn, - Subscribe, - Unsubscribe -} from '@firebase/util'; +import { CompleteFn, NextFn, Subscribe, Unsubscribe } from '@firebase/util'; import { StorageError } from './implementation/error'; export { StorageError } from './implementation/error'; @@ -251,7 +246,6 @@ export type TaskEvent = 'state_changed'; */ export type TaskState = 'running' | 'paused' | 'success' | 'canceled' | 'error'; - /** * A stream observer for Firebase Storage. * @public From 18f7b07da2e1efcf8478844423d39b074e58086e Mon Sep 17 00:00:00 2001 From: Maneesh Tewani Date: Tue, 24 Jan 2023 11:01:02 -0800 Subject: [PATCH 04/14] Create hungry-glasses-impress.md --- .changeset/hungry-glasses-impress.md | 6 ++++++ 1 file changed, 6 insertions(+) create mode 100644 .changeset/hungry-glasses-impress.md diff --git a/.changeset/hungry-glasses-impress.md b/.changeset/hungry-glasses-impress.md new file mode 100644 index 00000000000..a8e9277e09f --- /dev/null +++ b/.changeset/hungry-glasses-impress.md @@ -0,0 +1,6 @@ +--- +"firebase": minor +"@firebase/storage": minor +--- + +Export StorageError class instead of interface From 58fbc428ed6d9e1158eb350cfe1d4a1e05d022c4 Mon Sep 17 00:00:00 2001 From: maneesht Date: Tue, 24 Jan 2023 19:03:41 +0000 Subject: [PATCH 05/14] Update API reports --- common/api-review/storage.api.md | 28 ++++++++++++++++++---------- 1 file changed, 18 insertions(+), 10 deletions(-) diff --git a/common/api-review/storage.api.md b/common/api-review/storage.api.md index 04df972b727..d9149dd3af2 100644 --- a/common/api-review/storage.api.md +++ b/common/api-review/storage.api.md @@ -134,13 +134,11 @@ export function getStorage(app?: FirebaseApp, bucketUrl?: string): FirebaseStora // @public export function getStream(ref: StorageReference, maxDownloadSizeBytes?: number): NodeJS.ReadableStream; -// Warning: (ae-forgotten-export) The symbol "StorageError" needs to be exported by the entry point index.d.ts -// // @internal (undocumented) -export function _invalidArgument(message: string): StorageError_2; +export function _invalidArgument(message: string): StorageError; // @internal (undocumented) -export function _invalidRootOperation(name: string): StorageError_2; +export function _invalidRootOperation(name: string): StorageError; // @public export function list(ref: StorageReference, options?: ListOptions): Promise; @@ -217,9 +215,19 @@ export interface SettableMetadata { } // @public -export interface StorageError extends FirebaseError { - serverResponse: string | null; -} +export class StorageError extends FirebaseError { + // Warning: (ae-forgotten-export) The symbol "StorageErrorCode" needs to be exported by the entry point index.d.ts + constructor(code: StorageErrorCode, message: string, status_?: number); + _codeEquals(code: StorageErrorCode): boolean; + customData: { + serverResponse: string | null; + }; + get serverResponse(): null | string; + set serverResponse(serverResponse: string | null); + // (undocumented) + get status(): number; + set status(status: number); + } // @public export interface StorageObserver { @@ -318,20 +326,20 @@ export class _UploadTask { constructor(ref: _Reference, blob: _FbsBlob, metadata?: Metadata | null); _blob: _FbsBlob; cancel(): boolean; - catch(onRejected: (p1: StorageError_2) => T | Promise): Promise; + catch(onRejected: (p1: StorageError) => T | Promise): Promise; // (undocumented) isExponentialBackoffExpired(): boolean; // Warning: (ae-forgotten-export) The symbol "Metadata" needs to be exported by the entry point index.d.ts _metadata: Metadata | null; // Warning: (ae-forgotten-export) The symbol "Unsubscribe" needs to be exported by the entry point index.d.ts // Warning: (ae-forgotten-export) The symbol "Subscribe" needs to be exported by the entry point index.d.ts - on(type: _TaskEvent, nextOrObserver?: StorageObserver | null | ((snapshot: UploadTaskSnapshot) => unknown), error?: ((a: StorageError_2) => unknown) | null, completed?: CompleteFn | null): Unsubscribe_2 | Subscribe_2; + on(type: _TaskEvent, nextOrObserver?: StorageObserver | null | ((snapshot: UploadTaskSnapshot) => unknown), error?: ((a: StorageError) => unknown) | null, completed?: CompleteFn | null): Unsubscribe_2 | Subscribe_2; pause(): boolean; resume(): boolean; get snapshot(): UploadTaskSnapshot; // Warning: (ae-forgotten-export) The symbol "InternalTaskState" needs to be exported by the entry point index.d.ts _state: InternalTaskState; - then(onFulfilled?: ((value: UploadTaskSnapshot) => U | Promise) | null, onRejected?: ((error: StorageError_2) => U | Promise) | null): Promise; + then(onFulfilled?: ((value: UploadTaskSnapshot) => U | Promise) | null, onRejected?: ((error: StorageError) => U | Promise) | null): Promise; _transferred: number; } From df7d9e1b9677ddb405fb7eb3a2a6a35ab177a86b Mon Sep 17 00:00:00 2001 From: Maneesh Tewani Date: Wed, 25 Jan 2023 09:29:50 -0800 Subject: [PATCH 06/14] Updated exports --- common/api-review/storage.api.md | 79 ++++++++++++++++++++++++---- packages/storage/src/public-types.ts | 2 +- 2 files changed, 71 insertions(+), 10 deletions(-) diff --git a/common/api-review/storage.api.md b/common/api-review/storage.api.md index 04df972b727..19bfc142cf0 100644 --- a/common/api-review/storage.api.md +++ b/common/api-review/storage.api.md @@ -134,13 +134,11 @@ export function getStorage(app?: FirebaseApp, bucketUrl?: string): FirebaseStora // @public export function getStream(ref: StorageReference, maxDownloadSizeBytes?: number): NodeJS.ReadableStream; -// Warning: (ae-forgotten-export) The symbol "StorageError" needs to be exported by the entry point index.d.ts -// // @internal (undocumented) -export function _invalidArgument(message: string): StorageError_2; +export function _invalidArgument(message: string): StorageError; // @internal (undocumented) -export function _invalidRootOperation(name: string): StorageError_2; +export function _invalidRootOperation(name: string): StorageError; // @public export function list(ref: StorageReference, options?: ListOptions): Promise; @@ -217,8 +215,71 @@ export interface SettableMetadata { } // @public -export interface StorageError extends FirebaseError { - serverResponse: string | null; +export class StorageError extends FirebaseError { + constructor(code: StorageErrorCode, message: string, status_?: number); + _codeEquals(code: StorageErrorCode): boolean; + customData: { + serverResponse: string | null; + }; + get serverResponse(): null | string; + set serverResponse(serverResponse: string | null); + // (undocumented) + get status(): number; + set status(status: number); + } + +// @public +export const enum StorageErrorCode { + // (undocumented) + APP_DELETED = "app-deleted", + // (undocumented) + BUCKET_NOT_FOUND = "bucket-not-found", + // (undocumented) + CANCELED = "canceled", + // (undocumented) + CANNOT_SLICE_BLOB = "cannot-slice-blob", + // (undocumented) + INTERNAL_ERROR = "internal-error", + // (undocumented) + INVALID_ARGUMENT = "invalid-argument", + // (undocumented) + INVALID_ARGUMENT_COUNT = "invalid-argument-count", + // (undocumented) + INVALID_CHECKSUM = "invalid-checksum", + // (undocumented) + INVALID_DEFAULT_BUCKET = "invalid-default-bucket", + // (undocumented) + INVALID_EVENT_NAME = "invalid-event-name", + // (undocumented) + INVALID_FORMAT = "invalid-format", + // (undocumented) + INVALID_ROOT_OPERATION = "invalid-root-operation", + // (undocumented) + INVALID_URL = "invalid-url", + // (undocumented) + NO_DEFAULT_BUCKET = "no-default-bucket", + // (undocumented) + NO_DOWNLOAD_URL = "no-download-url", + // (undocumented) + OBJECT_NOT_FOUND = "object-not-found", + // (undocumented) + PROJECT_NOT_FOUND = "project-not-found", + // (undocumented) + QUOTA_EXCEEDED = "quota-exceeded", + // (undocumented) + RETRY_LIMIT_EXCEEDED = "retry-limit-exceeded", + // (undocumented) + SERVER_FILE_WRONG_SIZE = "server-file-wrong-size", + // (undocumented) + UNAUTHENTICATED = "unauthenticated", + // (undocumented) + UNAUTHORIZED = "unauthorized", + // (undocumented) + UNAUTHORIZED_APP = "unauthorized-app", + // (undocumented) + UNKNOWN = "unknown", + // (undocumented) + UNSUPPORTED_ENVIRONMENT = "unsupported-environment" } // @public @@ -318,20 +379,20 @@ export class _UploadTask { constructor(ref: _Reference, blob: _FbsBlob, metadata?: Metadata | null); _blob: _FbsBlob; cancel(): boolean; - catch(onRejected: (p1: StorageError_2) => T | Promise): Promise; + catch(onRejected: (p1: StorageError) => T | Promise): Promise; // (undocumented) isExponentialBackoffExpired(): boolean; // Warning: (ae-forgotten-export) The symbol "Metadata" needs to be exported by the entry point index.d.ts _metadata: Metadata | null; // Warning: (ae-forgotten-export) The symbol "Unsubscribe" needs to be exported by the entry point index.d.ts // Warning: (ae-forgotten-export) The symbol "Subscribe" needs to be exported by the entry point index.d.ts - on(type: _TaskEvent, nextOrObserver?: StorageObserver | null | ((snapshot: UploadTaskSnapshot) => unknown), error?: ((a: StorageError_2) => unknown) | null, completed?: CompleteFn | null): Unsubscribe_2 | Subscribe_2; + on(type: _TaskEvent, nextOrObserver?: StorageObserver | null | ((snapshot: UploadTaskSnapshot) => unknown), error?: ((a: StorageError) => unknown) | null, completed?: CompleteFn | null): Unsubscribe_2 | Subscribe_2; pause(): boolean; resume(): boolean; get snapshot(): UploadTaskSnapshot; // Warning: (ae-forgotten-export) The symbol "InternalTaskState" needs to be exported by the entry point index.d.ts _state: InternalTaskState; - then(onFulfilled?: ((value: UploadTaskSnapshot) => U | Promise) | null, onRejected?: ((error: StorageError_2) => U | Promise) | null): Promise; + then(onFulfilled?: ((value: UploadTaskSnapshot) => U | Promise) | null, onRejected?: ((error: StorageError) => U | Promise) | null): Promise; _transferred: number; } diff --git a/packages/storage/src/public-types.ts b/packages/storage/src/public-types.ts index 2c67d87cc8b..1d3eefb8483 100644 --- a/packages/storage/src/public-types.ts +++ b/packages/storage/src/public-types.ts @@ -20,7 +20,7 @@ import { FirebaseApp, _FirebaseService } from '@firebase/app'; import { CompleteFn, NextFn, Subscribe, Unsubscribe } from '@firebase/util'; import { StorageError } from './implementation/error'; -export { StorageError } from './implementation/error'; +export { StorageError, StorageErrorCode } from './implementation/error'; /** * A Firebase Storage instance. From 0290cdbdcb7ecdf05280b5ae3a9548389e1650bd Mon Sep 17 00:00:00 2001 From: Maneesh Tewani Date: Wed, 25 Jan 2023 10:15:42 -0800 Subject: [PATCH 07/14] Reworded changeset --- .changeset/hungry-glasses-impress.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.changeset/hungry-glasses-impress.md b/.changeset/hungry-glasses-impress.md index a8e9277e09f..7a12d1e6ab9 100644 --- a/.changeset/hungry-glasses-impress.md +++ b/.changeset/hungry-glasses-impress.md @@ -3,4 +3,4 @@ "@firebase/storage": minor --- -Export StorageError class instead of interface +Fixed issue where users were unable to check if an Error was an instance of `StorageError`. From 11e5d43401fc3329a13cbb54bce81dc3d3c6ca58 Mon Sep 17 00:00:00 2001 From: Maneesh Tewani Date: Wed, 25 Jan 2023 12:39:47 -0800 Subject: [PATCH 08/14] Moved export --- packages/storage/src/api.ts | 2 ++ packages/storage/src/public-types.ts | 2 -- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/packages/storage/src/api.ts b/packages/storage/src/api.ts index 301ca6cab98..b629c5d5b59 100644 --- a/packages/storage/src/api.ts +++ b/packages/storage/src/api.ts @@ -59,6 +59,8 @@ import { StringFormat } from './implementation/string'; export { EmulatorMockTokenOptions } from '@firebase/util'; +export { StorageError, StorageErrorCode } from './implementation/error'; + /** * Public types. */ diff --git a/packages/storage/src/public-types.ts b/packages/storage/src/public-types.ts index 1d3eefb8483..879b7058354 100644 --- a/packages/storage/src/public-types.ts +++ b/packages/storage/src/public-types.ts @@ -20,8 +20,6 @@ import { FirebaseApp, _FirebaseService } from '@firebase/app'; import { CompleteFn, NextFn, Subscribe, Unsubscribe } from '@firebase/util'; import { StorageError } from './implementation/error'; -export { StorageError, StorageErrorCode } from './implementation/error'; - /** * A Firebase Storage instance. * @public From 5585cdf7e3392f75ebf02a1c1699d3eeb57be507 Mon Sep 17 00:00:00 2001 From: Maneesh Tewani Date: Wed, 25 Jan 2023 13:30:19 -0800 Subject: [PATCH 09/14] Fixed storage-types to use proper StorageError --- common/api-review/storage.api.md | 2 +- packages/storage-types/index.d.ts | 6 +----- packages/storage/src/implementation/error.ts | 2 +- 3 files changed, 3 insertions(+), 7 deletions(-) diff --git a/common/api-review/storage.api.md b/common/api-review/storage.api.md index 19bfc142cf0..84173245c95 100644 --- a/common/api-review/storage.api.md +++ b/common/api-review/storage.api.md @@ -229,7 +229,7 @@ export class StorageError extends FirebaseError { } // @public -export const enum StorageErrorCode { +export enum StorageErrorCode { // (undocumented) APP_DELETED = "app-deleted", // (undocumented) diff --git a/packages/storage-types/index.d.ts b/packages/storage-types/index.d.ts index c6a8fc7178d..64ee78278bd 100644 --- a/packages/storage-types/index.d.ts +++ b/packages/storage-types/index.d.ts @@ -16,10 +16,10 @@ */ import { FirebaseApp } from '@firebase/app-types'; +import { StorageError as FirebaseStorageError } from '@firebase/storage'; import { CompleteFn, EmulatorMockTokenOptions, - FirebaseError, NextFn, Unsubscribe } from '@firebase/util'; @@ -91,10 +91,6 @@ export interface UploadMetadata extends SettableMetadata { md5Hash?: string | null; } -interface FirebaseStorageError extends FirebaseError { - serverResponse: string | null; -} - export interface StorageObserver { next?: NextFn | null; error?: (error: FirebaseStorageError) => void | null; diff --git a/packages/storage/src/implementation/error.ts b/packages/storage/src/implementation/error.ts index da90e3900ee..2d8fe7705fb 100644 --- a/packages/storage/src/implementation/error.ts +++ b/packages/storage/src/implementation/error.ts @@ -85,7 +85,7 @@ export const errors = {}; * @public * Error codes that can be attached to `StorageError`s. */ -export const enum StorageErrorCode { +export enum StorageErrorCode { // Shared between all platforms UNKNOWN = 'unknown', OBJECT_NOT_FOUND = 'object-not-found', From 7476d35093cac8dbdcbdfe6d4a177d9e3cd2f9cd Mon Sep 17 00:00:00 2001 From: Maneesh Tewani Date: Wed, 25 Jan 2023 15:38:35 -0800 Subject: [PATCH 10/14] Used interface instead of class --- packages/storage-compat/src/task.ts | 2 +- packages/storage-types/index.d.ts | 48 ++++++++++++++++++++++++++++- 2 files changed, 48 insertions(+), 2 deletions(-) diff --git a/packages/storage-compat/src/task.ts b/packages/storage-compat/src/task.ts index 66a4dd9262e..7cc6f7ba9bd 100644 --- a/packages/storage-compat/src/task.ts +++ b/packages/storage-compat/src/task.ts @@ -65,7 +65,7 @@ export class UploadTaskCompat implements types.UploadTask, Compat { | types.StorageObserver | null | ((a: UploadTaskSnapshotCompat) => unknown), - error?: (error: StorageError) => void | null, + error?: ((error: StorageError) => void) | null, completed?: () => void | null ): Unsubscribe | Subscribe { let wrappedNextOrObserver: diff --git a/packages/storage-types/index.d.ts b/packages/storage-types/index.d.ts index 64ee78278bd..c9386e13a38 100644 --- a/packages/storage-types/index.d.ts +++ b/packages/storage-types/index.d.ts @@ -16,10 +16,10 @@ */ import { FirebaseApp } from '@firebase/app-types'; -import { StorageError as FirebaseStorageError } from '@firebase/storage'; import { CompleteFn, EmulatorMockTokenOptions, + FirebaseError, NextFn, Unsubscribe } from '@firebase/util'; @@ -96,7 +96,53 @@ export interface StorageObserver { error?: (error: FirebaseStorageError) => void | null; complete?: CompleteFn | null; } +export declare enum StorageErrorCode { + UNKNOWN = 'unknown', + OBJECT_NOT_FOUND = 'object-not-found', + BUCKET_NOT_FOUND = 'bucket-not-found', + PROJECT_NOT_FOUND = 'project-not-found', + QUOTA_EXCEEDED = 'quota-exceeded', + UNAUTHENTICATED = 'unauthenticated', + UNAUTHORIZED = 'unauthorized', + UNAUTHORIZED_APP = 'unauthorized-app', + RETRY_LIMIT_EXCEEDED = 'retry-limit-exceeded', + INVALID_CHECKSUM = 'invalid-checksum', + CANCELED = 'canceled', + INVALID_EVENT_NAME = 'invalid-event-name', + INVALID_URL = 'invalid-url', + INVALID_DEFAULT_BUCKET = 'invalid-default-bucket', + NO_DEFAULT_BUCKET = 'no-default-bucket', + CANNOT_SLICE_BLOB = 'cannot-slice-blob', + SERVER_FILE_WRONG_SIZE = 'server-file-wrong-size', + NO_DOWNLOAD_URL = 'no-download-url', + INVALID_ARGUMENT = 'invalid-argument', + INVALID_ARGUMENT_COUNT = 'invalid-argument-count', + APP_DELETED = 'app-deleted', + INVALID_ROOT_OPERATION = 'invalid-root-operation', + INVALID_FORMAT = 'invalid-format', + INTERNAL_ERROR = 'internal-error', + UNSUPPORTED_ENVIRONMENT = 'unsupported-environment' +} +export interface FirebaseStorageError extends FirebaseError { + /** + * Stores custom error data unque to StorageError. + */ + customData: { + serverResponse: string | null; + }; + get status(): number; + set status(status: number); + /** + * Compares a StorageErrorCode against this error's code, filtering out the prefix. + */ + _codeEquals(code: StorageErrorCode): boolean; + /** + * Optional response message that was added by the server. + */ + get serverResponse(): null | string; + set serverResponse(serverResponse: string | null); +} export interface UploadTask { cancel(): boolean; catch(onRejected: (error: FirebaseStorageError) => any): Promise; From 89c4478938e245ff00e1aa57bcac9a13ec641b65 Mon Sep 17 00:00:00 2001 From: Maneesh Tewani Date: Wed, 25 Jan 2023 15:38:48 -0800 Subject: [PATCH 11/14] Replaced declare --- packages/storage-types/index.d.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/storage-types/index.d.ts b/packages/storage-types/index.d.ts index c9386e13a38..f88e8887195 100644 --- a/packages/storage-types/index.d.ts +++ b/packages/storage-types/index.d.ts @@ -96,7 +96,7 @@ export interface StorageObserver { error?: (error: FirebaseStorageError) => void | null; complete?: CompleteFn | null; } -export declare enum StorageErrorCode { +export enum StorageErrorCode { UNKNOWN = 'unknown', OBJECT_NOT_FOUND = 'object-not-found', BUCKET_NOT_FOUND = 'bucket-not-found', From 23124609ab26245b5d328e570d9fbb968676c417 Mon Sep 17 00:00:00 2001 From: Maneesh Tewani Date: Thu, 26 Jan 2023 09:11:29 -0800 Subject: [PATCH 12/14] Added storage-types and storage-compat --- .changeset/hungry-glasses-impress.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/.changeset/hungry-glasses-impress.md b/.changeset/hungry-glasses-impress.md index 7a12d1e6ab9..90f5840d28e 100644 --- a/.changeset/hungry-glasses-impress.md +++ b/.changeset/hungry-glasses-impress.md @@ -1,6 +1,8 @@ --- "firebase": minor "@firebase/storage": minor +"@firebase/storage-types": minor +"@firebase/storage-compat": minor --- Fixed issue where users were unable to check if an Error was an instance of `StorageError`. From 332cf31b07ee243687d5c0850368eee80c68096a Mon Sep 17 00:00:00 2001 From: Maneesh Tewani Date: Thu, 26 Jan 2023 14:21:12 -0800 Subject: [PATCH 13/14] Added comments and fixed typings --- packages/firebase/compat/index.d.ts | 54 +++++++++++++++++++++++++++-- packages/storage-types/index.d.ts | 2 ++ 2 files changed, 54 insertions(+), 2 deletions(-) diff --git a/packages/firebase/compat/index.d.ts b/packages/firebase/compat/index.d.ts index aa9281fc588..1d2b1e7bf7c 100644 --- a/packages/firebase/compat/index.d.ts +++ b/packages/firebase/compat/index.d.ts @@ -8017,11 +8017,61 @@ declare namespace firebase.storage { md5Hash?: string | null; } + /** + * @public + * Error codes that can be attached to `StorageError`s. + */ + export enum StorageErrorCode { + UNKNOWN = 'unknown', + OBJECT_NOT_FOUND = 'object-not-found', + BUCKET_NOT_FOUND = 'bucket-not-found', + PROJECT_NOT_FOUND = 'project-not-found', + QUOTA_EXCEEDED = 'quota-exceeded', + UNAUTHENTICATED = 'unauthenticated', + UNAUTHORIZED = 'unauthorized', + UNAUTHORIZED_APP = 'unauthorized-app', + RETRY_LIMIT_EXCEEDED = 'retry-limit-exceeded', + INVALID_CHECKSUM = 'invalid-checksum', + CANCELED = 'canceled', + INVALID_EVENT_NAME = 'invalid-event-name', + INVALID_URL = 'invalid-url', + INVALID_DEFAULT_BUCKET = 'invalid-default-bucket', + NO_DEFAULT_BUCKET = 'no-default-bucket', + CANNOT_SLICE_BLOB = 'cannot-slice-blob', + SERVER_FILE_WRONG_SIZE = 'server-file-wrong-size', + NO_DOWNLOAD_URL = 'no-download-url', + INVALID_ARGUMENT = 'invalid-argument', + INVALID_ARGUMENT_COUNT = 'invalid-argument-count', + APP_DELETED = 'app-deleted', + INVALID_ROOT_OPERATION = 'invalid-root-operation', + INVALID_FORMAT = 'invalid-format', + INTERNAL_ERROR = 'internal-error', + UNSUPPORTED_ENVIRONMENT = 'unsupported-environment' + } + /** * An error returned by the Firebase Storage SDK. + * @public */ - interface FirebaseStorageError extends FirebaseError { - serverResponse: string | null; + export interface FirebaseStorageError extends FirebaseError { + /** + * Stores custom error data unque to StorageError. + */ + customData: { + serverResponse: string | null; + }; + + get status(): number; + set status(status: number); + /** + * Compares a StorageErrorCode against this error's code, filtering out the prefix. + */ + _codeEquals(code: StorageErrorCode): boolean; + /** + * Optional response message that was added by the server. + */ + get serverResponse(): null | string; + set serverResponse(serverResponse: string | null); } interface StorageObserver { diff --git a/packages/storage-types/index.d.ts b/packages/storage-types/index.d.ts index f88e8887195..e42c32bbb96 100644 --- a/packages/storage-types/index.d.ts +++ b/packages/storage-types/index.d.ts @@ -96,6 +96,7 @@ export interface StorageObserver { error?: (error: FirebaseStorageError) => void | null; complete?: CompleteFn | null; } + export enum StorageErrorCode { UNKNOWN = 'unknown', OBJECT_NOT_FOUND = 'object-not-found', @@ -123,6 +124,7 @@ export enum StorageErrorCode { INTERNAL_ERROR = 'internal-error', UNSUPPORTED_ENVIRONMENT = 'unsupported-environment' } + export interface FirebaseStorageError extends FirebaseError { /** * Stores custom error data unque to StorageError. From f7dd97deccddbd20264d15386b08bba073863321 Mon Sep 17 00:00:00 2001 From: Maneesh Tewani Date: Thu, 26 Jan 2023 16:34:39 -0800 Subject: [PATCH 14/14] Removed public tags --- packages/firebase/compat/index.d.ts | 2 -- 1 file changed, 2 deletions(-) diff --git a/packages/firebase/compat/index.d.ts b/packages/firebase/compat/index.d.ts index 1d2b1e7bf7c..773c240c379 100644 --- a/packages/firebase/compat/index.d.ts +++ b/packages/firebase/compat/index.d.ts @@ -8018,7 +8018,6 @@ declare namespace firebase.storage { } /** - * @public * Error codes that can be attached to `StorageError`s. */ export enum StorageErrorCode { @@ -8051,7 +8050,6 @@ declare namespace firebase.storage { /** * An error returned by the Firebase Storage SDK. - * @public */ export interface FirebaseStorageError extends FirebaseError { /**