diff --git a/CHANGELOG.md b/CHANGELOG.md index d105fdaf10..338ed016ba 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -7,6 +7,8 @@ - [changed] Modified the Realtime Database client integration to report the correct user agent header. - [changed] Upgraded Cloud Firestire client to v0.12.0. +- [changed] Improved error handling in FCM by mapping more server-side errors + to client-side error codes. # v5.9.0 diff --git a/src/utils/error.ts b/src/utils/error.ts index 986a4e6770..938f3c19d0 100644 --- a/src/utils/error.ts +++ b/src/utils/error.ts @@ -613,14 +613,20 @@ const MESSAGING_SERVER_TO_CLIENT_CODE: ServerToClientCode = { // Invalid APNs credentials. InvalidApnsCredential: 'INVALID_APNS_CREDENTIALS', - /* FCM new server API error codes */ - UNREGISTERED: 'REGISTRATION_TOKEN_NOT_REGISTERED', + /* FCM v1 canonical error codes */ + NOT_FOUND: 'REGISTRATION_TOKEN_NOT_REGISTERED', + PERMISSION_DENIED: 'MISMATCHED_CREDENTIAL', + RESOURCE_EXHAUSTED: 'MESSAGE_RATE_EXCEEDED', + UNAUTHENTICATED: 'INVALID_APNS_CREDENTIALS', + + /* FCM v1 new error codes */ + APNS_AUTH_ERROR: 'INVALID_APNS_CREDENTIALS', + INTERNAL: 'INTERNAL_ERROR', INVALID_ARGUMENT: 'INVALID_ARGUMENT', QUOTA_EXCEEDED: 'MESSAGE_RATE_EXCEEDED', SENDER_ID_MISMATCH: 'MISMATCHED_CREDENTIAL', - APNS_AUTH_ERROR: 'INVALID_APNS_CREDENTIALS', UNAVAILABLE: 'SERVER_UNAVAILABLE', - INTERNAL: 'INTERNAL_ERROR', + UNREGISTERED: 'REGISTRATION_TOKEN_NOT_REGISTERED', UNSPECIFIED_ERROR: 'UNKNOWN_ERROR', }; diff --git a/test/unit/messaging/messaging.spec.ts b/test/unit/messaging/messaging.spec.ts index e27dddcc46..b848897695 100644 --- a/test/unit/messaging/messaging.spec.ts +++ b/test/unit/messaging/messaging.spec.ts @@ -419,6 +419,20 @@ describe('Messaging', () => { .and.have.property('code', 'messaging/invalid-argument'); }); + it('should map server error code to client-side error', () => { + const resp = { + error: { + status: 'NOT_FOUND', + message: 'test error message', + }, + }; + mockedRequests.push(mockSendError(404, 'json', resp)); + return messaging.send( + {token: 'mock-token'}, + ).should.eventually.be.rejectedWith('test error message') + .and.have.property('code', 'messaging/registration-token-not-registered'); + }); + it('should fail when the backend server returns an unknown error', () => { const resp = {error: 'test error message'}; mockedRequests.push(mockSendError(400, 'json', resp));