Skip to content

Commit a263827

Browse files
authored
Migrates Listeners Registration from getMessaging to Messaging's Factory Methods 🏭 (#4918)
1 parent 4bdc9f3 commit a263827

File tree

8 files changed

+69
-73
lines changed

8 files changed

+69
-73
lines changed

common/api-review/messaging-exp.api.md

-5
Original file line numberDiff line numberDiff line change
@@ -59,11 +59,6 @@ export interface NotificationPayload {
5959

6060
export { Observer }
6161

62-
// Warning: (ae-internal-missing-underscore) The name "onBackgroundMessage" should be prefixed with an underscore because the declaration is marked as @internal
63-
//
64-
// @internal
65-
export function onBackgroundMessage(messaging: FirebaseMessaging, nextOrObserver: NextFn<MessagePayload> | Observer<MessagePayload>): Unsubscribe;
66-
6762
// @public
6863
export function onMessage(messaging: FirebaseMessaging, nextOrObserver: NextFn<MessagePayload> | Observer<MessagePayload>): Unsubscribe;
6964

packages-exp/messaging-compat/src/messaging-compat.ts

+2-14
Original file line numberDiff line numberDiff line change
@@ -24,11 +24,12 @@ import {
2424
MessagePayload,
2525
deleteToken,
2626
getToken,
27-
onBackgroundMessage,
2827
onMessage
2928
} from '@firebase/messaging-exp';
3029
import { NextFn, Observer, Unsubscribe } from '@firebase/util';
3130

31+
import { onBackgroundMessage } from '@firebase/messaging-exp/sw';
32+
3233
export interface MessagingCompat {
3334
getToken(options?: {
3435
vapidKey?: string;
@@ -88,19 +89,6 @@ function isSwSupported(): boolean {
8889
}
8990

9091
export class MessagingCompatImpl implements MessagingCompat, _FirebaseService {
91-
swRegistration?: ServiceWorkerRegistration;
92-
vapidKey?: string;
93-
94-
onBackgroundMessageHandler:
95-
| NextFn<MessagePayload>
96-
| Observer<MessagePayload>
97-
| null = null;
98-
99-
onMessageHandler:
100-
| NextFn<MessagePayload>
101-
| Observer<MessagePayload>
102-
| null = null;
103-
10492
constructor(readonly app: AppCompat, readonly _delegate: FirebaseMessaging) {
10593
this.app = app;
10694
this._delegate = _delegate;

packages-exp/messaging-compat/src/registerMessagingCompat.ts

+14-4
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,7 @@ import {
2222
InstanceFactory
2323
} from '@firebase/component';
2424
import firebase, { _FirebaseNamespace } from '@firebase/app-compat';
25+
2526
import { MessagingCompatImpl } from './messaging-compat';
2627

2728
declare module '@firebase/component' {
@@ -33,10 +34,19 @@ declare module '@firebase/component' {
3334
const messagingCompatFactory: InstanceFactory<'messaging-compat'> = (
3435
container: ComponentContainer
3536
) => {
36-
return new MessagingCompatImpl(
37-
container.getProvider('app-compat').getImmediate(),
38-
container.getProvider('messaging-exp').getImmediate()
39-
);
37+
if (!!navigator) {
38+
// in window
39+
return new MessagingCompatImpl(
40+
container.getProvider('app-compat').getImmediate(),
41+
container.getProvider('messaging-exp').getImmediate()
42+
);
43+
} else {
44+
// in sw
45+
return new MessagingCompatImpl(
46+
container.getProvider('app-compat').getImmediate(),
47+
container.getProvider('messaging-sw-exp').getImmediate()
48+
);
49+
}
4050
};
4151

4252
export function registerMessagingCompat(): void {

packages-exp/messaging-compat/test/messaging-compat.test.ts

+5-1
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@
1616
*/
1717

1818
import * as messagingModule from '@firebase/messaging-exp';
19+
import * as messagingModuleInSw from '@firebase/messaging-exp/sw';
1920

2021
import { getFakeApp, getFakeModularMessaging } from './fakes';
2122

@@ -33,7 +34,10 @@ describe('messagingCompat', () => {
3334
const getTokenStub = stub(messagingModule, 'getToken');
3435
const deleteTokenStub = stub(messagingModule, 'deleteToken');
3536
const onMessageStub = stub(messagingModule, 'onMessage');
36-
const onBackgroundMessageStub = stub(messagingModule, 'onBackgroundMessage');
37+
const onBackgroundMessageStub = stub(
38+
messagingModuleInSw,
39+
'onBackgroundMessage'
40+
);
3741

3842
it('routes messagingCompat.getToken to modular SDK', () => {
3943
void messagingCompat.getToken();

packages-exp/messaging-exp/src/api.ts

+12-43
Original file line numberDiff line numberDiff line change
@@ -23,20 +23,12 @@ import {
2323
Unsubscribe,
2424
getModularInstance
2525
} from '@firebase/util';
26-
import {
27-
onNotificationClick,
28-
onPush,
29-
onSubChange
30-
} from './listeners/sw-listeners';
3126

3227
import { MessagingService } from './messaging-service';
33-
import { Provider } from '@firebase/component';
34-
import { ServiceWorkerGlobalScope } from './util/sw-types';
3528
import { deleteToken as _deleteToken } from './api/deleteToken';
3629
import { getToken as _getToken } from './api/getToken';
3730
import { onBackgroundMessage as _onBackgroundMessage } from './api/onBackgroundMessage';
3831
import { onMessage as _onMessage } from './api/onMessage';
39-
import { messageEventListener } from './listeners/window-listener';
4032

4133
/**
4234
* Retrieves a Firebase Cloud Messaging instance.
@@ -48,45 +40,23 @@ import { messageEventListener } from './listeners/window-listener';
4840
export function getMessagingInWindow(
4941
app: FirebaseApp = getApp()
5042
): FirebaseMessaging {
51-
app = getModularInstance(app);
52-
const messagingProvider: Provider<'messaging-exp'> = _getProvider(
53-
app,
54-
'messaging-exp'
55-
);
56-
const messaging = messagingProvider.getImmediate();
57-
58-
navigator.serviceWorker.addEventListener('message', e =>
59-
messageEventListener(messaging as MessagingService, e)
60-
);
61-
62-
return messaging;
43+
return _getProvider(getModularInstance(app), 'messaging-exp').getImmediate();
6344
}
6445

6546
/**
66-
* Retrieves a firebase messaging instance.
47+
* Retrieves a Firebase Cloud Messaging instance.
6748
*
68-
* @returns the firebase messaging instance associated with the provided firebase app.
49+
* @returns The Firebase Cloud Messaging instance associated with the provided firebase app.
6950
*
51+
* @public
7052
*/
71-
declare const self: ServiceWorkerGlobalScope;
72-
export function getMessagingInSw(app: FirebaseApp): FirebaseMessaging {
73-
const messagingProvider: Provider<'messaging-exp'> = _getProvider(
74-
app,
75-
'messaging-exp'
76-
);
77-
const messaging = messagingProvider.getImmediate();
78-
79-
self.addEventListener('push', e => {
80-
e.waitUntil(onPush(e, messaging as MessagingService));
81-
});
82-
self.addEventListener('pushsubscriptionchange', e => {
83-
e.waitUntil(onSubChange(e, messaging as MessagingService));
84-
});
85-
self.addEventListener('notificationclick', e => {
86-
e.waitUntil(onNotificationClick(e));
87-
});
88-
89-
return messagingProvider.getImmediate();
53+
export function getMessagingInSw(
54+
app: FirebaseApp = getApp()
55+
): FirebaseMessaging {
56+
return _getProvider(
57+
getModularInstance(app),
58+
'messaging-sw-exp'
59+
).getImmediate();
9060
}
9161

9262
/**
@@ -172,8 +142,7 @@ export function onMessage(
172142
*
173143
* @returns To stop listening for messages execute this returned function
174144
*
175-
* make it internal to hide it from the browser entry point.
176-
* @internal
145+
* @public
177146
*/
178147
export function onBackgroundMessage(
179148
messaging: FirebaseMessaging,

packages-exp/messaging-exp/src/helpers/register.ts

+34-3
Original file line numberDiff line numberDiff line change
@@ -23,9 +23,16 @@ import {
2323
} from '@firebase/component';
2424
import { ERROR_FACTORY, ErrorCode } from '../util/errors';
2525
import { isSwSupported, isWindowSupported } from '../api/isSupported';
26+
import {
27+
onNotificationClick,
28+
onPush,
29+
onSubChange
30+
} from '../listeners/sw-listeners';
2631

2732
import { MessagingService } from '../messaging-service';
33+
import { ServiceWorkerGlobalScope } from '../util/sw-types';
2834
import { _registerComponent } from '@firebase/app-exp';
35+
import { messageEventListener } from '../listeners/window-listener';
2936

3037
const WindowMessagingFactory: InstanceFactory<'messaging-exp'> = (
3138
container: ComponentContainer
@@ -44,13 +51,20 @@ const WindowMessagingFactory: InstanceFactory<'messaging-exp'> = (
4451
throw ERROR_FACTORY.create(ErrorCode.INDEXED_DB_UNSUPPORTED);
4552
});
4653

47-
return new MessagingService(
54+
const messaging = new MessagingService(
4855
container.getProvider('app-exp').getImmediate(),
4956
container.getProvider('installations-exp-internal').getImmediate(),
5057
container.getProvider('analytics-internal')
5158
);
59+
60+
navigator.serviceWorker.addEventListener('message', e =>
61+
messageEventListener(messaging as MessagingService, e)
62+
);
63+
64+
return messaging;
5265
};
5366

67+
declare const self: ServiceWorkerGlobalScope;
5468
const SwMessagingFactory: InstanceFactory<'messaging-exp'> = (
5569
container: ComponentContainer
5670
) => {
@@ -68,11 +82,23 @@ const SwMessagingFactory: InstanceFactory<'messaging-exp'> = (
6882
throw ERROR_FACTORY.create(ErrorCode.INDEXED_DB_UNSUPPORTED);
6983
});
7084

71-
return new MessagingService(
85+
const messaging = new MessagingService(
7286
container.getProvider('app-exp').getImmediate(),
7387
container.getProvider('installations-exp-internal').getImmediate(),
7488
container.getProvider('analytics-internal')
7589
);
90+
91+
self.addEventListener('push', e => {
92+
e.waitUntil(onPush(e, messaging as MessagingService));
93+
});
94+
self.addEventListener('pushsubscriptionchange', e => {
95+
e.waitUntil(onSubChange(e, messaging as MessagingService));
96+
});
97+
self.addEventListener('notificationclick', e => {
98+
e.waitUntil(onNotificationClick(e));
99+
});
100+
101+
return messaging;
76102
};
77103

78104
export function registerMessagingInWindow(): void {
@@ -81,8 +107,13 @@ export function registerMessagingInWindow(): void {
81107
);
82108
}
83109

110+
/**
111+
* The messaging instance registered in sw is named differently than that of in client. This is
112+
* because both `registerMessagingInWindow` and `registerMessagingInSw` would be called in
113+
* `messaging-compat` and component with the same name can only be registered once.
114+
*/
84115
export function registerMessagingInSw(): void {
85116
_registerComponent(
86-
new Component('messaging-exp', SwMessagingFactory, ComponentType.PUBLIC)
117+
new Component('messaging-sw-exp', SwMessagingFactory, ComponentType.PUBLIC)
87118
);
88119
}

packages-exp/messaging-exp/src/index.sw.ts

+1-1
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,7 @@ export { isSwSupported as isSupported } from './api/isSupported';
2525

2626
declare module '@firebase/component' {
2727
interface NameServiceMapping {
28-
'messaging-exp': FirebaseMessaging;
28+
'messaging-sw-exp': FirebaseMessaging;
2929
}
3030
}
3131

packages-exp/messaging-exp/src/index.ts

+1-2
Original file line numberDiff line numberDiff line change
@@ -30,8 +30,7 @@ export {
3030
getToken,
3131
deleteToken,
3232
onMessage,
33-
getMessagingInWindow as getMessaging,
34-
onBackgroundMessage
33+
getMessagingInWindow as getMessaging
3534
} from './api';
3635
export { isWindowSupported as isSupported } from './api/isSupported';
3736
export * from './interfaces/public-types';

0 commit comments

Comments
 (0)