Skip to content

Commit 3d7a0eb

Browse files
committed
Register 2 components one for sw and one for client
1 parent 3f2eb18 commit 3d7a0eb

File tree

5 files changed

+43
-30
lines changed

5 files changed

+43
-30
lines changed

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

Lines changed: 2 additions & 1 deletion
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;

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

Lines changed: 19 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -37,10 +37,28 @@ import { onMessage as _onMessage } from './api/onMessage';
3737
*
3838
* @public
3939
*/
40-
export function getMessaging(app: FirebaseApp = getApp()): FirebaseMessaging {
40+
export function getMessagingInWindow(
41+
app: FirebaseApp = getApp()
42+
): FirebaseMessaging {
4143
return _getProvider(getModularInstance(app), 'messaging-exp').getImmediate();
4244
}
4345

46+
/**
47+
* Retrieves a Firebase Cloud Messaging instance.
48+
*
49+
* @returns The Firebase Cloud Messaging instance associated with the provided firebase app.
50+
*
51+
* @public
52+
*/
53+
export function getMessagingInSw(
54+
app: FirebaseApp = getApp()
55+
): FirebaseMessaging {
56+
return _getProvider(
57+
getModularInstance(app),
58+
'messaging-sw-exp'
59+
).getImmediate();
60+
}
61+
4462
/**
4563
* Subscribes the `FirebaseMessaging` instance to push notifications. Returns an Firebase Cloud
4664
* Messaging registration token that can be used to send push messages to that `FirebaseMessaging`

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

Lines changed: 19 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -29,7 +29,6 @@ import {
2929
onSubChange
3030
} from '../listeners/sw-listeners';
3131

32-
import { FirebaseMessaging } from '../interfaces/public-types';
3332
import { MessagingService } from '../messaging-service';
3433
import { ServiceWorkerGlobalScope } from '../util/sw-types';
3534
import { _registerComponent } from '@firebase/app-exp';
@@ -58,11 +57,14 @@ const WindowMessagingFactory: InstanceFactory<'messaging-exp'> = (
5857
container.getProvider('analytics-internal')
5958
);
6059

61-
registerListeners(messaging);
60+
navigator.serviceWorker.addEventListener('message', e =>
61+
messageEventListener(messaging as MessagingService, e)
62+
);
6263

6364
return messaging;
6465
};
6566

67+
declare const self: ServiceWorkerGlobalScope;
6668
const SwMessagingFactory: InstanceFactory<'messaging-exp'> = (
6769
container: ComponentContainer
6870
) => {
@@ -86,7 +88,15 @@ const SwMessagingFactory: InstanceFactory<'messaging-exp'> = (
8688
container.getProvider('analytics-internal')
8789
);
8890

89-
registerListeners(messaging);
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+
});
90100

91101
return messaging;
92102
};
@@ -97,29 +107,13 @@ export function registerMessagingInWindow(): void {
97107
);
98108
}
99109

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+
*/
100115
export function registerMessagingInSw(): void {
101116
_registerComponent(
102-
new Component('messaging-exp', SwMessagingFactory, ComponentType.PUBLIC)
117+
new Component('messaging-sw-exp', SwMessagingFactory, ComponentType.PUBLIC)
103118
);
104119
}
105-
106-
declare const self: ServiceWorkerGlobalScope;
107-
function registerListeners(messaging: FirebaseMessaging): void {
108-
if (!!navigator) {
109-
// in window
110-
navigator.serviceWorker.addEventListener('message', e =>
111-
messageEventListener(messaging as MessagingService, e)
112-
);
113-
} else {
114-
// in sw
115-
self.addEventListener('push', e => {
116-
e.waitUntil(onPush(e, messaging as MessagingService));
117-
});
118-
self.addEventListener('pushsubscriptionchange', e => {
119-
e.waitUntil(onSubChange(e, messaging as MessagingService));
120-
});
121-
self.addEventListener('notificationclick', e => {
122-
e.waitUntil(onNotificationClick(e));
123-
});
124-
}
125-
}

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

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -20,12 +20,12 @@ import '@firebase/installations-exp';
2020
import { FirebaseMessaging } from './interfaces/public-types';
2121
import { registerMessagingInSw } from './helpers/register';
2222

23-
export { onBackgroundMessage, getMessaging } from './api';
23+
export { onBackgroundMessage, getMessagingInSw as getMessaging } from './api';
2424
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

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -30,7 +30,7 @@ export {
3030
getToken,
3131
deleteToken,
3232
onMessage,
33-
getMessaging,
33+
getMessagingInWindow as getMessaging,
3434
onBackgroundMessage
3535
} from './api';
3636
export { isWindowSupported as isSupported } from './api/isSupported';

0 commit comments

Comments
 (0)