firebase / firebase/firebase-js-sdk
Memory leak in MessagingService._delete() method
- Dominant language
- TypeScript
- Stars
- 5.1k
- Forks
- 1k
- Avg merge
- 2d 21h
- Merged PRs (30d)
- 37
Description
## Bug Description
The `MessagingService._delete()` method in the Firebase Messaging SDK has a memory leak issue where resources are not properly cleaned up when the service is deleted.
## Root Cause
The current implementation of `MessagingService._delete()` only returns `Promise.resolve()` without cleaning up:
1. **Timer leak**: The logging service starts a recursive `setTimeout` loop via `_processQueue()` that continues indefinitely
2. **Event listener leak**: Event listeners added in factory functions are never removed
3. **Missing cleanup**: No cleanup of message handlers, log events, or service worker references
## Impact
- Memory leaks when Firebase messaging service is deleted
- Timers continue running in the background
- Event listeners remain attached
- Potential performance degradation over time
## Affected Code
- `packages/messaging/src/messaging-service.ts` - `_delete()` method
- `packages/messaging/src/helpers/logToFirelog.ts` - `_processQueue()` timer management
- `packages/messaging/src/helpers/register.ts` - Event listener registration
## Comparison with Other Services
Other Firebase services like `AppCheckService` properly clean up their resources in `_delete()` methods by removing listeners and clearing state.
## Proposed Solution
Implement proper resource cleanup in `MessagingService._delete()` including:
- Clear logging timers
- Remove event listeners
- Reset all properties to initial state
- Clear message handlers and log events
- Provide cleanup mechanism for registered cleanup functions
## Environment
- Firebase JS SDK version: 11.8.1
- Affects both browser and service worker environments
Contributor guide
Assessment
This issue has not been assessed yet.