Skip to content

Added minimal support for sending FCM messages in async using HTTP/2 #870

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 5 commits into from
Apr 10, 2025

Conversation

jonathanedey
Copy link
Contributor

@jonathanedey jonathanedey commented Apr 8, 2025

Adds basic logic for sending FCM messages in async using HTTP/2

This initial PR covers:

  • Exporting async method send_each_async()
  • Handling refreshing of google.auth credentials and retrying refresh on 401 errors
  • Basic retry logic for 503 and 500 errors (no backoff)
  • Status and request error mapping to FirebaseErrors
  • Simple unit and integration tests

Unverified

This user has not yet uploaded their public signing key.

Unverified

This user has not yet uploaded their public signing key.

Unverified

This user has not yet uploaded their public signing key.
@jonathanedey jonathanedey added the release:stage Stage a release candidate label Apr 8, 2025

Unverified

This user has not yet uploaded their public signing key.
error_dict, message = _parse_platform_error(content, status_code)
exc = None
if handle_func:
exc = handle_func(error, message, error_dict)
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

As we discussed offline, let's confirm if this complex code path is necessary for error handling. If it is not, let's clean it up and keep it simple :)

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Looks like we use this map FCM specific errors like:

FCM_ERROR_TYPES = {
        'APNS_AUTH_ERROR': ThirdPartyAuthError,
        'QUOTA_EXCEEDED': QuotaExceededError,
        'SENDER_ID_MISMATCH': SenderIdMismatchError,
        'THIRD_PARTY_AUTH_ERROR': ThirdPartyAuthError,
        'UNREGISTERED': UnregisteredError,
}

We map to these errors by parsing the error response details. The default handle_func (handle_X_error) is agnostic to the source service of the error and doesn't try to parse based the error response details. FCM is the only service that currently makes use of this optional handle_func but this seems like the correct way to support this scenario.

We could move the logic from the helper function _handle_func_X to handle_platform_error_from_X.

Will merge as is and we can revisit this in a follow up PR if necessary.

pyjwt[crypto] >= 2.5.0
httpx[http2] == 0.28.1
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

let's add this new dependency to setup.py

Unverified

This user has not yet uploaded their public signing key.
@jonathanedey jonathanedey merged commit a4bc029 into fcm-http2 Apr 10, 2025
12 checks passed
@jonathanedey jonathanedey deleted the je-httpx branch April 10, 2025 20:26
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
release:stage Stage a release candidate
Projects
None yet
Development

Successfully merging this pull request may close these issues.

None yet

2 participants