Expand description
§Firebase Messaging Port (Rust)
§Introduction
Rust implementation of the Firebase Cloud Messaging (FCM) web SDK surface. The goal is to mirror the @firebase/messaging APIs so applications can manage web push permissions, registration tokens and foreground/background notifications from Rust (including WASM builds).
§Porting status
- messaging 25%
[### ]
§Quick Start Example
use firebase_rs_sdk::messaging::{
self, PermissionState, PushSubscriptionManager, ServiceWorkerManager,
};
#[cfg(all(target_arch = "wasm32", feature = "wasm-web"))]
async fn initialise_messaging() -> messaging::error::MessagingResult<()> {
if !messaging::is_supported() {
return Err(messaging::error::unsupported_browser(
"Browser is missing push APIs",
));
}
let mut sw_manager = ServiceWorkerManager::new();
let registration = sw_manager.register_default().await?;
let mut push_manager = PushSubscriptionManager::new();
let vapid_key = "<your-public-vapid-key>";
let messaging = messaging::get_messaging(None)?;
if matches!(messaging.request_permission().await?, PermissionState::Granted) {
let subscription = push_manager.subscribe(®istration, vapid_key).await?;
let details = subscription.details()?;
let _token = messaging.get_token(Some(vapid_key)).await?;
}
Ok(())
}§Implemented
- Component registration that exposes
Messagingthrough the shared component system. - In-memory token management for
get_tokenanddelete_tokenwith validation of VAPID keys. messaging::is_supported()guard that mirrorspackages/messaging/src/api/isSupported.tsfor web builds.- Asynchronous
Messaging::request_permissionflow that awaitsNotification.requestPermissionand surfacesmessaging/permission-blockedandmessaging/unsupported-browsererrors. ServiceWorkerManagerhelper that registers the default Firebase messaging worker (mirrorshelpers/registerDefaultSw.ts) and caches the resulting registration for reuse.- WASM-only
PushSubscriptionManagerthat wrapsPushManager.subscribe, returns subscription details and supports unsubscribe/error mapping aligned with the JS SDK implementation. - Token persistence layer that stores token metadata (including subscription details and creation time) per app, mirroring the IndexedDB-backed token manager with IndexedDB on wasm (plus BroadcastChannel sync) and in-memory fallback on native targets. Weekly refresh logic invalidates tokens after 7 days to trigger regeneration.
- Minimal error types for invalid arguments, internal failures and token deletion.
- Non-WASM unit test coverage for permission/token flows, invalid arguments, token deletion, service worker and push subscription stubs.
§Still to do
- Track permission changes across sessions and expose notification status helpers similar to the JS SDK.
- Call the Installations and FCM REST endpoints to create, refresh and delete tokens, including weekly refresh checks.
- Coordinate multi-tab state and periodic refresh triggers using IndexedDB change listeners (BroadcastChannel / storage events).
- Foreground/background message listeners, payload decoding and background handlers.
- Environment-specific guards (SW vs window scope), emulator/testing helpers and extended error coverage.
§Next steps - Detailed completion plan
- Adopt the async Installations refresh path documented in
src/installations/README.md(wasmfetchclient + shared persistence) so messaging can obtain real FIS tokens on every target. - Implement the Installations/FCM REST interactions for token create/update/delete, mirroring
internals/token-manager.ts. - Add multi-tab coordination (BroadcastChannel/localStorage) so IndexedDB state stays in sync across contexts.
- Port message delivery APIs (
onMessage,onBackgroundMessage) and event dispatchers, including WASM gating for background handlers. - Expand the error catalog to match
packages/messaging/src/util/errors.ts, update documentation and backfill tests for the newly added behaviours.
Modules§
Structs§
Enums§
- Permission
State - Notification permission states as exposed by the Web Notifications API.
Functions§
- get_
messaging - is_
supported - Returns
falseoutside a web environment, where the required browser APIs are unavailable. - register_
messaging_ component