@metamask-previews/notification-services-controller 0.21.0-preview-cc687932 → 0.21.0-preview-1cc9329c

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (111) hide show
  1. package/dist/NotificationServicesController/NotificationServicesController.cjs +73 -59
  2. package/dist/NotificationServicesController/NotificationServicesController.cjs.map +1 -1
  3. package/dist/NotificationServicesController/NotificationServicesController.d.cts +34 -10
  4. package/dist/NotificationServicesController/NotificationServicesController.d.cts.map +1 -1
  5. package/dist/NotificationServicesController/NotificationServicesController.d.mts +34 -10
  6. package/dist/NotificationServicesController/NotificationServicesController.d.mts.map +1 -1
  7. package/dist/NotificationServicesController/NotificationServicesController.mjs +73 -59
  8. package/dist/NotificationServicesController/NotificationServicesController.mjs.map +1 -1
  9. package/dist/NotificationServicesController/index.cjs +0 -1
  10. package/dist/NotificationServicesController/index.cjs.map +1 -1
  11. package/dist/NotificationServicesController/index.d.cts +0 -1
  12. package/dist/NotificationServicesController/index.d.cts.map +1 -1
  13. package/dist/NotificationServicesController/index.d.mts +0 -1
  14. package/dist/NotificationServicesController/index.d.mts.map +1 -1
  15. package/dist/NotificationServicesController/index.mjs +0 -1
  16. package/dist/NotificationServicesController/index.mjs.map +1 -1
  17. package/dist/NotificationServicesPushController/NotificationServicesPushController.cjs +45 -54
  18. package/dist/NotificationServicesPushController/NotificationServicesPushController.cjs.map +1 -1
  19. package/dist/NotificationServicesPushController/NotificationServicesPushController.d.cts +17 -16
  20. package/dist/NotificationServicesPushController/NotificationServicesPushController.d.cts.map +1 -1
  21. package/dist/NotificationServicesPushController/NotificationServicesPushController.d.mts +17 -16
  22. package/dist/NotificationServicesPushController/NotificationServicesPushController.d.mts.map +1 -1
  23. package/dist/NotificationServicesPushController/NotificationServicesPushController.mjs +46 -55
  24. package/dist/NotificationServicesPushController/NotificationServicesPushController.mjs.map +1 -1
  25. package/dist/NotificationServicesPushController/constants.cjs +14 -0
  26. package/dist/NotificationServicesPushController/constants.cjs.map +1 -0
  27. package/dist/NotificationServicesPushController/constants.d.cts +11 -0
  28. package/dist/NotificationServicesPushController/constants.d.cts.map +1 -0
  29. package/dist/NotificationServicesPushController/constants.d.mts +11 -0
  30. package/dist/NotificationServicesPushController/constants.d.mts.map +1 -0
  31. package/dist/NotificationServicesPushController/constants.mjs +11 -0
  32. package/dist/NotificationServicesPushController/constants.mjs.map +1 -0
  33. package/dist/NotificationServicesPushController/{types/push-service-interface.cjs → services/push/index.cjs} +1 -1
  34. package/dist/NotificationServicesPushController/services/push/index.cjs.map +1 -0
  35. package/dist/NotificationServicesPushController/services/push/index.d.cts +6 -0
  36. package/dist/NotificationServicesPushController/services/push/index.d.cts.map +1 -0
  37. package/dist/NotificationServicesPushController/services/push/index.d.mts +6 -0
  38. package/dist/NotificationServicesPushController/services/push/index.d.mts.map +1 -0
  39. package/dist/NotificationServicesPushController/services/push/index.mjs +2 -0
  40. package/dist/NotificationServicesPushController/services/push/index.mjs.map +1 -0
  41. package/dist/NotificationServicesPushController/services/services.cjs +26 -3
  42. package/dist/NotificationServicesPushController/services/services.cjs.map +1 -1
  43. package/dist/NotificationServicesPushController/services/services.d.cts +15 -1
  44. package/dist/NotificationServicesPushController/services/services.d.cts.map +1 -1
  45. package/dist/NotificationServicesPushController/services/services.d.mts +15 -1
  46. package/dist/NotificationServicesPushController/services/services.d.mts.map +1 -1
  47. package/dist/NotificationServicesPushController/services/services.mjs +24 -2
  48. package/dist/NotificationServicesPushController/services/services.mjs.map +1 -1
  49. package/dist/NotificationServicesPushController/types/index.cjs.map +1 -1
  50. package/dist/NotificationServicesPushController/types/index.d.cts +0 -1
  51. package/dist/NotificationServicesPushController/types/index.d.cts.map +1 -1
  52. package/dist/NotificationServicesPushController/types/index.d.mts +0 -1
  53. package/dist/NotificationServicesPushController/types/index.d.mts.map +1 -1
  54. package/dist/NotificationServicesPushController/types/index.mjs.map +1 -1
  55. package/dist/NotificationServicesPushController/utils/get-notification-message.cjs +19 -1
  56. package/dist/NotificationServicesPushController/utils/get-notification-message.cjs.map +1 -1
  57. package/dist/NotificationServicesPushController/utils/get-notification-message.d.cts +7 -0
  58. package/dist/NotificationServicesPushController/utils/get-notification-message.d.cts.map +1 -1
  59. package/dist/NotificationServicesPushController/utils/get-notification-message.d.mts +7 -0
  60. package/dist/NotificationServicesPushController/utils/get-notification-message.d.mts.map +1 -1
  61. package/dist/NotificationServicesPushController/utils/get-notification-message.mjs +17 -0
  62. package/dist/NotificationServicesPushController/utils/get-notification-message.mjs.map +1 -1
  63. package/package.json +1 -11
  64. package/dist/NotificationServicesPushController/__fixtures__/mockMessenger.cjs +0 -14
  65. package/dist/NotificationServicesPushController/__fixtures__/mockMessenger.cjs.map +0 -1
  66. package/dist/NotificationServicesPushController/__fixtures__/mockMessenger.d.cts +0 -3
  67. package/dist/NotificationServicesPushController/__fixtures__/mockMessenger.d.cts.map +0 -1
  68. package/dist/NotificationServicesPushController/__fixtures__/mockMessenger.d.mts +0 -3
  69. package/dist/NotificationServicesPushController/__fixtures__/mockMessenger.d.mts.map +0 -1
  70. package/dist/NotificationServicesPushController/__fixtures__/mockMessenger.mjs +0 -10
  71. package/dist/NotificationServicesPushController/__fixtures__/mockMessenger.mjs.map +0 -1
  72. package/dist/NotificationServicesPushController/types/push-service-interface.cjs.map +0 -1
  73. package/dist/NotificationServicesPushController/types/push-service-interface.d.cts +0 -30
  74. package/dist/NotificationServicesPushController/types/push-service-interface.d.cts.map +0 -1
  75. package/dist/NotificationServicesPushController/types/push-service-interface.d.mts +0 -30
  76. package/dist/NotificationServicesPushController/types/push-service-interface.d.mts.map +0 -1
  77. package/dist/NotificationServicesPushController/types/push-service-interface.mjs +0 -2
  78. package/dist/NotificationServicesPushController/types/push-service-interface.mjs.map +0 -1
  79. package/dist/NotificationServicesPushController/web/index.cjs +0 -8
  80. package/dist/NotificationServicesPushController/web/index.cjs.map +0 -1
  81. package/dist/NotificationServicesPushController/web/index.d.cts +0 -2
  82. package/dist/NotificationServicesPushController/web/index.d.cts.map +0 -1
  83. package/dist/NotificationServicesPushController/web/index.d.mts +0 -2
  84. package/dist/NotificationServicesPushController/web/index.d.mts.map +0 -1
  85. package/dist/NotificationServicesPushController/web/index.mjs +0 -2
  86. package/dist/NotificationServicesPushController/web/index.mjs.map +0 -1
  87. package/dist/NotificationServicesPushController/web/push-utils.cjs +0 -170
  88. package/dist/NotificationServicesPushController/web/push-utils.cjs.map +0 -1
  89. package/dist/NotificationServicesPushController/web/push-utils.d.cts +0 -37
  90. package/dist/NotificationServicesPushController/web/push-utils.d.cts.map +0 -1
  91. package/dist/NotificationServicesPushController/web/push-utils.d.mts +0 -37
  92. package/dist/NotificationServicesPushController/web/push-utils.d.mts.map +0 -1
  93. package/dist/NotificationServicesPushController/web/push-utils.mjs +0 -168
  94. package/dist/NotificationServicesPushController/web/push-utils.mjs.map +0 -1
  95. package/dist/shared/index.cjs +0 -19
  96. package/dist/shared/index.cjs.map +0 -1
  97. package/dist/shared/index.d.cts +0 -3
  98. package/dist/shared/index.d.cts.map +0 -1
  99. package/dist/shared/index.d.mts +0 -3
  100. package/dist/shared/index.d.mts.map +0 -1
  101. package/dist/shared/index.mjs +0 -3
  102. package/dist/shared/index.mjs.map +0 -1
  103. package/dist/shared/is-onchain-notification.cjs +0 -22
  104. package/dist/shared/is-onchain-notification.cjs.map +0 -1
  105. package/dist/shared/is-onchain-notification.d.cts +0 -9
  106. package/dist/shared/is-onchain-notification.d.cts.map +0 -1
  107. package/dist/shared/is-onchain-notification.d.mts +0 -9
  108. package/dist/shared/is-onchain-notification.d.mts.map +0 -1
  109. package/dist/shared/is-onchain-notification.mjs +0 -18
  110. package/dist/shared/is-onchain-notification.mjs.map +0 -1
  111. package/push-services/web/package.json +0 -9
@@ -1 +1 @@
1
- {"version":3,"file":"NotificationServicesPushController.cjs","sourceRoot":"","sources":["../../src/NotificationServicesPushController/NotificationServicesPushController.ts"],"names":[],"mappings":"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","sourcesContent":["import type {\n RestrictedMessenger,\n ControllerGetStateAction,\n ControllerStateChangeEvent,\n StateMetadata,\n} from '@metamask/base-controller';\nimport { BaseController } from '@metamask/base-controller';\nimport type { AuthenticationController } from '@metamask/profile-sync-controller';\nimport log from 'loglevel';\n\nimport {\n activatePushNotifications,\n deactivatePushNotifications,\n updateTriggerPushNotifications,\n} from './services/services';\nimport type { PushNotificationEnv } from './types';\nimport type { PushService } from './types/push-service-interface';\nimport type { Types } from '../NotificationServicesController';\n\nconst controllerName = 'NotificationServicesPushController';\n\nexport type NotificationServicesPushControllerState = {\n isPushEnabled: boolean;\n fcmToken: string;\n};\n\nexport type NotificationServicesPushControllerGetStateAction =\n ControllerGetStateAction<\n typeof controllerName,\n NotificationServicesPushControllerState\n >;\n\nexport type NotificationServicesPushControllerEnablePushNotificationsAction = {\n type: `${typeof controllerName}:enablePushNotifications`;\n handler: NotificationServicesPushController['enablePushNotifications'];\n};\nexport type NotificationServicesPushControllerDisablePushNotificationsAction = {\n type: `${typeof controllerName}:disablePushNotifications`;\n handler: NotificationServicesPushController['disablePushNotifications'];\n};\nexport type NotificationServicesPushControllerUpdateTriggerPushNotificationsAction =\n {\n type: `${typeof controllerName}:updateTriggerPushNotifications`;\n handler: NotificationServicesPushController['updateTriggerPushNotifications'];\n };\nexport type NotificationServicesPushControllerSubscribeToNotificationsAction = {\n type: `${typeof controllerName}:subscribeToPushNotifications`;\n handler: NotificationServicesPushController['subscribeToPushNotifications'];\n};\n\nexport type Actions =\n | NotificationServicesPushControllerGetStateAction\n | NotificationServicesPushControllerEnablePushNotificationsAction\n | NotificationServicesPushControllerDisablePushNotificationsAction\n | NotificationServicesPushControllerUpdateTriggerPushNotificationsAction\n | NotificationServicesPushControllerSubscribeToNotificationsAction;\n\nexport type AllowedActions =\n AuthenticationController.AuthenticationControllerGetBearerToken;\n\nexport type NotificationServicesPushControllerStateChangeEvent =\n ControllerStateChangeEvent<\n typeof controllerName,\n NotificationServicesPushControllerState\n >;\n\nexport type NotificationServicesPushControllerOnNewNotificationEvent = {\n type: `${typeof controllerName}:onNewNotifications`;\n payload: [Types.INotification];\n};\n\nexport type NotificationServicesPushControllerPushNotificationClickedEvent = {\n type: `${typeof controllerName}:pushNotificationClicked`;\n payload: [Types.INotification];\n};\n\nexport type Events =\n | NotificationServicesPushControllerStateChangeEvent\n | NotificationServicesPushControllerOnNewNotificationEvent\n | NotificationServicesPushControllerPushNotificationClickedEvent;\n\nexport type AllowedEvents = never;\n\nexport type NotificationServicesPushControllerMessenger = RestrictedMessenger<\n typeof controllerName,\n Actions | AllowedActions,\n Events | AllowedEvents,\n AllowedActions['type'],\n AllowedEvents['type']\n>;\n\nexport const defaultState: NotificationServicesPushControllerState = {\n isPushEnabled: true,\n fcmToken: '',\n};\nconst metadata: StateMetadata<NotificationServicesPushControllerState> = {\n isPushEnabled: {\n persist: true,\n anonymous: true,\n },\n fcmToken: {\n persist: true,\n anonymous: true,\n },\n};\n\nconst defaultPushEnv: PushNotificationEnv = {\n apiKey: '',\n authDomain: '',\n storageBucket: '',\n projectId: '',\n messagingSenderId: '',\n appId: '',\n measurementId: '',\n vapidKey: '',\n};\n\nexport type ControllerConfig = {\n /**\n * Global switch to determine to use push notifications\n * Allows us to control Builds on extension (MV2 vs MV3)\n */\n isPushFeatureEnabled?: boolean;\n\n /**\n * determine the config used for push notification services\n */\n platform: 'extension' | 'mobile';\n\n /**\n * Push Service Interface\n * - create reg token\n * - delete reg token\n * - subscribe to push notifications\n */\n pushService: PushService;\n};\n\ntype StateCommand =\n | { type: 'enable'; fcmToken: string }\n | { type: 'disable' }\n | { type: 'update'; fcmToken: string };\n\n/**\n * Manages push notifications for the application, including enabling, disabling, and updating triggers for push notifications.\n * This controller integrates with Firebase Cloud Messaging (FCM) to handle the registration and management of push notifications.\n * It is responsible for registering and unregistering the service worker that listens for push notifications,\n * managing the FCM token, and communicating with the server to register or unregister the device for push notifications.\n * Additionally, it provides functionality to update the server with new UUIDs that should trigger push notifications.\n */\nexport default class NotificationServicesPushController extends BaseController<\n typeof controllerName,\n NotificationServicesPushControllerState,\n NotificationServicesPushControllerMessenger\n> {\n #pushListenerUnsubscribe: (() => void) | undefined = undefined;\n\n readonly #env: PushNotificationEnv;\n\n readonly #config: ControllerConfig;\n\n constructor({\n messenger,\n state,\n env,\n config,\n }: {\n messenger: NotificationServicesPushControllerMessenger;\n state: NotificationServicesPushControllerState;\n /** Push Environment is only required for extension */\n env?: PushNotificationEnv;\n config: ControllerConfig;\n }) {\n super({\n messenger,\n metadata,\n name: controllerName,\n state: { ...defaultState, ...state },\n });\n\n this.#env = env ?? defaultPushEnv;\n this.#config = config;\n\n this.#registerMessageHandlers();\n }\n\n #registerMessageHandlers(): void {\n this.messagingSystem.registerActionHandler(\n 'NotificationServicesPushController:enablePushNotifications',\n this.enablePushNotifications.bind(this),\n );\n this.messagingSystem.registerActionHandler(\n 'NotificationServicesPushController:disablePushNotifications',\n this.disablePushNotifications.bind(this),\n );\n this.messagingSystem.registerActionHandler(\n 'NotificationServicesPushController:updateTriggerPushNotifications',\n this.updateTriggerPushNotifications.bind(this),\n );\n this.messagingSystem.registerActionHandler(\n 'NotificationServicesPushController:subscribeToPushNotifications',\n this.subscribeToPushNotifications.bind(this),\n );\n }\n\n async #getAndAssertBearerToken() {\n const bearerToken = await this.messagingSystem.call(\n 'AuthenticationController:getBearerToken',\n );\n if (!bearerToken) {\n log.error(\n 'Failed to enable push notifications: BearerToken token is missing.',\n );\n throw new Error('BearerToken token is missing');\n }\n\n return bearerToken;\n }\n\n #updatePushState(command: StateCommand) {\n if (command.type === 'enable') {\n this.update((state) => {\n state.isPushEnabled = true;\n state.fcmToken = command.fcmToken;\n });\n }\n\n if (command.type === 'disable') {\n this.update((state) => {\n state.isPushEnabled = false;\n state.fcmToken = '';\n });\n }\n\n if (command.type === 'update') {\n this.update((state) => {\n state.isPushEnabled = true;\n state.fcmToken = command.fcmToken;\n });\n }\n }\n\n async subscribeToPushNotifications() {\n if (!this.#config.isPushFeatureEnabled) {\n return;\n }\n\n if (this.#pushListenerUnsubscribe) {\n this.#pushListenerUnsubscribe();\n this.#pushListenerUnsubscribe = undefined;\n }\n\n try {\n this.#pushListenerUnsubscribe =\n (await this.#config.pushService.subscribeToPushNotifications(\n this.#env,\n )) ?? undefined;\n } catch {\n // Do nothing, we are silently failing if push notification registration fails\n }\n }\n\n /**\n * Enables push notifications for the application.\n *\n * This method sets up the necessary infrastructure for handling push notifications by:\n * 1. Registering the service worker to listen for messages.\n * 2. Fetching the Firebase Cloud Messaging (FCM) token from Firebase.\n * 3. Sending the FCM token to the server responsible for sending notifications, to register the device.\n *\n * @param UUIDs - An array of UUIDs to enable push notifications for.\n */\n async enablePushNotifications(UUIDs: string[]) {\n if (!this.#config.isPushFeatureEnabled) {\n return;\n }\n\n // Handle creating new reg token (if available)\n try {\n const bearerToken = await this.#getAndAssertBearerToken().catch(\n () => null,\n );\n\n // If there is a bearer token, lets try to refresh/create new reg token\n if (bearerToken) {\n // Activate Push Notifications\n const fcmToken = await activatePushNotifications({\n bearerToken,\n triggers: UUIDs,\n env: this.#env,\n createRegToken: this.#config.pushService.createRegToken,\n platform: this.#config.platform,\n }).catch(() => null);\n\n if (fcmToken) {\n this.#updatePushState({ type: 'enable', fcmToken });\n }\n }\n } catch {\n // Do nothing, we are silently failing\n }\n\n // New token created, (re)subscribe to push notifications\n await this.subscribeToPushNotifications();\n }\n\n /**\n * Disables push notifications for the application.\n * This removes the registration token on this device, and ensures we unsubscribe from any listeners\n */\n async disablePushNotifications() {\n if (!this.#config.isPushFeatureEnabled) {\n return;\n }\n\n try {\n // Send a request to the server to unregister the token/device\n await deactivatePushNotifications({\n env: this.#env,\n deleteRegToken: this.#config.pushService.deleteRegToken,\n regToken: this.state.fcmToken,\n });\n } catch (error) {\n const errorMessage = `Failed to disable push notifications: ${\n error as string\n }`;\n log.error(errorMessage);\n throw new Error(errorMessage);\n }\n\n // Unsubscribe from push notifications\n this.#pushListenerUnsubscribe?.();\n\n // Update State\n this.#updatePushState({ type: 'disable' });\n }\n\n /**\n * Updates the triggers for push notifications.\n * This method is responsible for updating the server with the new set of UUIDs that should trigger push notifications.\n * It uses the current FCM token and a BearerToken for authentication.\n *\n * @param UUIDs - An array of UUIDs that should trigger push notifications.\n */\n async updateTriggerPushNotifications(UUIDs: string[]) {\n if (!this.#config.isPushFeatureEnabled) {\n return;\n }\n\n const bearerToken = await this.#getAndAssertBearerToken();\n\n try {\n const { fcmToken } = await updateTriggerPushNotifications({\n bearerToken,\n triggers: UUIDs,\n env: this.#env,\n createRegToken: this.#config.pushService.createRegToken,\n deleteRegToken: this.#config.pushService.deleteRegToken,\n platform: this.#config.platform,\n });\n\n // update the state with the new FCM token\n if (fcmToken) {\n this.#updatePushState({ type: 'update', fcmToken });\n }\n } catch (error) {\n const errorMessage = `Failed to update triggers for push notifications: ${\n error as string\n }`;\n log.error(errorMessage);\n throw new Error(errorMessage);\n }\n }\n}\n"]}
1
+ {"version":3,"file":"NotificationServicesPushController.cjs","sourceRoot":"","sources":["../../src/NotificationServicesPushController/NotificationServicesPushController.ts"],"names":[],"mappings":"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","sourcesContent":["import type {\n RestrictedMessenger,\n ControllerGetStateAction,\n ControllerStateChangeEvent,\n StateMetadata,\n} from '@metamask/base-controller';\nimport { BaseController } from '@metamask/base-controller';\nimport type { AuthenticationController } from '@metamask/profile-sync-controller';\nimport log from 'loglevel';\n\nimport { createRegToken, deleteRegToken } from './services/push/push-web';\nimport {\n activatePushNotifications,\n deactivatePushNotifications,\n listenToPushNotifications,\n updateTriggerPushNotifications,\n} from './services/services';\nimport type { PushNotificationEnv } from './types';\nimport type { Types } from '../NotificationServicesController';\n\nconst controllerName = 'NotificationServicesPushController';\n\nexport type NotificationServicesPushControllerState = {\n fcmToken: string;\n};\n\nexport type NotificationServicesPushControllerGetStateAction =\n ControllerGetStateAction<\n typeof controllerName,\n NotificationServicesPushControllerState\n >;\n\nexport type NotificationServicesPushControllerEnablePushNotificationsAction = {\n type: `${typeof controllerName}:enablePushNotifications`;\n handler: NotificationServicesPushController['enablePushNotifications'];\n};\nexport type NotificationServicesPushControllerDisablePushNotificationsAction = {\n type: `${typeof controllerName}:disablePushNotifications`;\n handler: NotificationServicesPushController['disablePushNotifications'];\n};\nexport type NotificationServicesPushControllerUpdateTriggerPushNotificationsAction =\n {\n type: `${typeof controllerName}:updateTriggerPushNotifications`;\n handler: NotificationServicesPushController['updateTriggerPushNotifications'];\n };\nexport type NotificationServicesPushControllerSubscribeToNotificationsAction = {\n type: `${typeof controllerName}:subscribeToPushNotifications`;\n handler: NotificationServicesPushController['subscribeToPushNotifications'];\n};\n\nexport type Actions =\n | NotificationServicesPushControllerGetStateAction\n | NotificationServicesPushControllerEnablePushNotificationsAction\n | NotificationServicesPushControllerDisablePushNotificationsAction\n | NotificationServicesPushControllerUpdateTriggerPushNotificationsAction\n | NotificationServicesPushControllerSubscribeToNotificationsAction;\n\nexport type AllowedActions =\n AuthenticationController.AuthenticationControllerGetBearerToken;\n\nexport type NotificationServicesPushControllerStateChangeEvent =\n ControllerStateChangeEvent<\n typeof controllerName,\n NotificationServicesPushControllerState\n >;\n\nexport type NotificationServicesPushControllerOnNewNotificationEvent = {\n type: `${typeof controllerName}:onNewNotifications`;\n payload: [Types.INotification];\n};\n\nexport type NotificationServicesPushControllerPushNotificationClickedEvent = {\n type: `${typeof controllerName}:pushNotificationClicked`;\n payload: [Types.INotification];\n};\n\nexport type Events =\n | NotificationServicesPushControllerStateChangeEvent\n | NotificationServicesPushControllerOnNewNotificationEvent\n | NotificationServicesPushControllerPushNotificationClickedEvent;\n\nexport type AllowedEvents = never;\n\nexport type NotificationServicesPushControllerMessenger = RestrictedMessenger<\n typeof controllerName,\n Actions | AllowedActions,\n Events | AllowedEvents,\n AllowedActions['type'],\n AllowedEvents['type']\n>;\n\nexport const defaultState: NotificationServicesPushControllerState = {\n fcmToken: '',\n};\nconst metadata: StateMetadata<NotificationServicesPushControllerState> = {\n fcmToken: {\n persist: true,\n anonymous: true,\n },\n};\n\ntype ControllerConfig = {\n /**\n * Config to turn on/off push notifications.\n * This is currently linked to MV3 builds on extension.\n */\n isPushEnabled: boolean;\n\n /**\n * Must handle when a push notification is received.\n * You must call `registration.showNotification` or equivalent to show the notification on web/mobile\n */\n onPushNotificationReceived: (\n notification: Types.INotification,\n ) => void | Promise<void>;\n\n /**\n * Must handle when a push notification is clicked.\n * You must call `event.notification.close();` or equivalent for closing and opening notification in a new window.\n */\n onPushNotificationClicked: (\n event: NotificationEvent,\n notification?: Types.INotification,\n ) => void;\n\n /**\n * determine the config used for push notification services\n */\n platform: 'extension' | 'mobile';\n};\n\n/**\n * Manages push notifications for the application, including enabling, disabling, and updating triggers for push notifications.\n * This controller integrates with Firebase Cloud Messaging (FCM) to handle the registration and management of push notifications.\n * It is responsible for registering and unregistering the service worker that listens for push notifications,\n * managing the FCM token, and communicating with the server to register or unregister the device for push notifications.\n * Additionally, it provides functionality to update the server with new UUIDs that should trigger push notifications.\n */\nexport default class NotificationServicesPushController extends BaseController<\n typeof controllerName,\n NotificationServicesPushControllerState,\n NotificationServicesPushControllerMessenger\n> {\n #pushListenerUnsubscribe: (() => void) | undefined = undefined;\n\n readonly #env: PushNotificationEnv;\n\n readonly #config: ControllerConfig;\n\n constructor({\n messenger,\n state,\n env,\n config,\n }: {\n messenger: NotificationServicesPushControllerMessenger;\n state: NotificationServicesPushControllerState;\n env: PushNotificationEnv;\n config: ControllerConfig;\n }) {\n super({\n messenger,\n metadata,\n name: controllerName,\n state: { ...defaultState, ...state },\n });\n\n this.#env = env;\n this.#config = config;\n\n this.#registerMessageHandlers();\n }\n\n #registerMessageHandlers(): void {\n this.messagingSystem.registerActionHandler(\n 'NotificationServicesPushController:enablePushNotifications',\n this.enablePushNotifications.bind(this),\n );\n this.messagingSystem.registerActionHandler(\n 'NotificationServicesPushController:disablePushNotifications',\n this.disablePushNotifications.bind(this),\n );\n this.messagingSystem.registerActionHandler(\n 'NotificationServicesPushController:updateTriggerPushNotifications',\n this.updateTriggerPushNotifications.bind(this),\n );\n this.messagingSystem.registerActionHandler(\n 'NotificationServicesPushController:subscribeToPushNotifications',\n this.subscribeToPushNotifications.bind(this),\n );\n }\n\n async #getAndAssertBearerToken() {\n const bearerToken = await this.messagingSystem.call(\n 'AuthenticationController:getBearerToken',\n );\n if (!bearerToken) {\n log.error(\n 'Failed to enable push notifications: BearerToken token is missing.',\n );\n throw new Error('BearerToken token is missing');\n }\n\n return bearerToken;\n }\n\n async subscribeToPushNotifications() {\n if (this.#pushListenerUnsubscribe) {\n this.#pushListenerUnsubscribe();\n this.#pushListenerUnsubscribe = undefined;\n }\n\n try {\n this.#pushListenerUnsubscribe = await listenToPushNotifications({\n env: this.#env,\n listenToPushReceived: async (n) => {\n this.messagingSystem.publish(\n 'NotificationServicesPushController:onNewNotifications',\n n,\n );\n await this.#config.onPushNotificationReceived(n);\n },\n listenToPushClicked: (e, n) => {\n if (n) {\n this.messagingSystem.publish(\n 'NotificationServicesPushController:pushNotificationClicked',\n n,\n );\n }\n\n this.#config.onPushNotificationClicked(e, n);\n },\n });\n } catch {\n // Do nothing, we are silently failing if push notification registration fails\n }\n }\n\n /**\n * Enables push notifications for the application.\n *\n * This method sets up the necessary infrastructure for handling push notifications by:\n * 1. Registering the service worker to listen for messages.\n * 2. Fetching the Firebase Cloud Messaging (FCM) token from Firebase.\n * 3. Sending the FCM token to the server responsible for sending notifications, to register the device.\n *\n * @param UUIDs - An array of UUIDs to enable push notifications for.\n * @param fcmToken - The optional FCM token to use for push notifications.\n */\n async enablePushNotifications(UUIDs: string[], fcmToken?: string) {\n if (!this.#config.isPushEnabled) {\n return;\n }\n\n // Handle creating new reg token (if available)\n try {\n const bearerToken = await this.#getAndAssertBearerToken().catch(\n () => null,\n );\n\n // If there is a bearer token, lets try to refresh/create new reg token\n if (bearerToken) {\n // Activate Push Notifications\n const regToken = await activatePushNotifications({\n bearerToken,\n triggers: UUIDs,\n env: this.#env,\n fcmToken,\n createRegToken,\n platform: this.#config.platform,\n }).catch(() => null);\n\n if (regToken) {\n this.update((state) => {\n state.fcmToken = regToken;\n });\n }\n }\n } catch {\n // Do nothing, we are silently failing\n }\n\n // New token created, (re)subscribe to push notifications\n await this.subscribeToPushNotifications();\n }\n\n /**\n * Disables push notifications for the application.\n * This removes the registration token on this device, and ensures we unsubscribe from any listeners\n */\n async disablePushNotifications() {\n if (!this.#config.isPushEnabled) {\n return;\n }\n\n let isPushNotificationsDisabled: boolean;\n\n try {\n // Send a request to the server to unregister the token/device\n isPushNotificationsDisabled = await deactivatePushNotifications({\n env: this.#env,\n deleteRegToken,\n regToken: this.state.fcmToken,\n });\n } catch (error) {\n const errorMessage = `Failed to disable push notifications: ${\n error as string\n }`;\n log.error(errorMessage);\n throw new Error(errorMessage);\n }\n\n // Remove the FCM token from the state\n if (!isPushNotificationsDisabled) {\n return;\n }\n\n // Unsubscribe from push notifications\n this.#pushListenerUnsubscribe?.();\n\n // Update State\n if (isPushNotificationsDisabled) {\n this.update((state) => {\n state.fcmToken = '';\n });\n }\n }\n\n /**\n * Updates the triggers for push notifications.\n * This method is responsible for updating the server with the new set of UUIDs that should trigger push notifications.\n * It uses the current FCM token and a BearerToken for authentication.\n *\n * @param UUIDs - An array of UUIDs that should trigger push notifications.\n */\n async updateTriggerPushNotifications(UUIDs: string[]) {\n if (!this.#config.isPushEnabled) {\n return;\n }\n\n const bearerToken = await this.#getAndAssertBearerToken();\n\n try {\n const { fcmToken } = await updateTriggerPushNotifications({\n bearerToken,\n triggers: UUIDs,\n env: this.#env,\n createRegToken,\n deleteRegToken,\n platform: this.#config.platform,\n });\n\n // update the state with the new FCM token\n if (fcmToken) {\n this.update((state) => {\n state.fcmToken = fcmToken;\n });\n }\n } catch (error) {\n const errorMessage = `Failed to update triggers for push notifications: ${\n error as string\n }`;\n log.error(errorMessage);\n throw new Error(errorMessage);\n }\n }\n}\n"]}
@@ -2,11 +2,9 @@ import type { RestrictedMessenger, ControllerGetStateAction, ControllerStateChan
2
2
  import { BaseController } from "@metamask/base-controller";
3
3
  import type { AuthenticationController } from "@metamask/profile-sync-controller";
4
4
  import type { PushNotificationEnv } from "./types/index.cjs";
5
- import type { PushService } from "./types/push-service-interface.cjs";
6
5
  import type { Types } from "../NotificationServicesController/index.cjs";
7
6
  declare const controllerName = "NotificationServicesPushController";
8
7
  export type NotificationServicesPushControllerState = {
9
- isPushEnabled: boolean;
10
8
  fcmToken: string;
11
9
  };
12
10
  export type NotificationServicesPushControllerGetStateAction = ControllerGetStateAction<typeof controllerName, NotificationServicesPushControllerState>;
@@ -41,23 +39,26 @@ export type Events = NotificationServicesPushControllerStateChangeEvent | Notifi
41
39
  export type AllowedEvents = never;
42
40
  export type NotificationServicesPushControllerMessenger = RestrictedMessenger<typeof controllerName, Actions | AllowedActions, Events | AllowedEvents, AllowedActions['type'], AllowedEvents['type']>;
43
41
  export declare const defaultState: NotificationServicesPushControllerState;
44
- export type ControllerConfig = {
42
+ type ControllerConfig = {
45
43
  /**
46
- * Global switch to determine to use push notifications
47
- * Allows us to control Builds on extension (MV2 vs MV3)
44
+ * Config to turn on/off push notifications.
45
+ * This is currently linked to MV3 builds on extension.
48
46
  */
49
- isPushFeatureEnabled?: boolean;
47
+ isPushEnabled: boolean;
50
48
  /**
51
- * determine the config used for push notification services
49
+ * Must handle when a push notification is received.
50
+ * You must call `registration.showNotification` or equivalent to show the notification on web/mobile
52
51
  */
53
- platform: 'extension' | 'mobile';
52
+ onPushNotificationReceived: (notification: Types.INotification) => void | Promise<void>;
54
53
  /**
55
- * Push Service Interface
56
- * - create reg token
57
- * - delete reg token
58
- * - subscribe to push notifications
54
+ * Must handle when a push notification is clicked.
55
+ * You must call `event.notification.close();` or equivalent for closing and opening notification in a new window.
59
56
  */
60
- pushService: PushService;
57
+ onPushNotificationClicked: (event: NotificationEvent, notification?: Types.INotification) => void;
58
+ /**
59
+ * determine the config used for push notification services
60
+ */
61
+ platform: 'extension' | 'mobile';
61
62
  };
62
63
  /**
63
64
  * Manages push notifications for the application, including enabling, disabling, and updating triggers for push notifications.
@@ -71,8 +72,7 @@ export default class NotificationServicesPushController extends BaseController<t
71
72
  constructor({ messenger, state, env, config, }: {
72
73
  messenger: NotificationServicesPushControllerMessenger;
73
74
  state: NotificationServicesPushControllerState;
74
- /** Push Environment is only required for extension */
75
- env?: PushNotificationEnv;
75
+ env: PushNotificationEnv;
76
76
  config: ControllerConfig;
77
77
  });
78
78
  subscribeToPushNotifications(): Promise<void>;
@@ -85,8 +85,9 @@ export default class NotificationServicesPushController extends BaseController<t
85
85
  * 3. Sending the FCM token to the server responsible for sending notifications, to register the device.
86
86
  *
87
87
  * @param UUIDs - An array of UUIDs to enable push notifications for.
88
+ * @param fcmToken - The optional FCM token to use for push notifications.
88
89
  */
89
- enablePushNotifications(UUIDs: string[]): Promise<void>;
90
+ enablePushNotifications(UUIDs: string[], fcmToken?: string): Promise<void>;
90
91
  /**
91
92
  * Disables push notifications for the application.
92
93
  * This removes the registration token on this device, and ensures we unsubscribe from any listeners
@@ -1 +1 @@
1
- {"version":3,"file":"NotificationServicesPushController.d.cts","sourceRoot":"","sources":["../../src/NotificationServicesPushController/NotificationServicesPushController.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"NotificationServicesPushController.d.cts","sourceRoot":"","sources":["../../src/NotificationServicesPushController/NotificationServicesPushController.ts"],"names":[],"mappings":"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"}
@@ -2,11 +2,9 @@ import type { RestrictedMessenger, ControllerGetStateAction, ControllerStateChan
2
2
  import { BaseController } from "@metamask/base-controller";
3
3
  import type { AuthenticationController } from "@metamask/profile-sync-controller";
4
4
  import type { PushNotificationEnv } from "./types/index.mjs";
5
- import type { PushService } from "./types/push-service-interface.mjs";
6
5
  import type { Types } from "../NotificationServicesController/index.mjs";
7
6
  declare const controllerName = "NotificationServicesPushController";
8
7
  export type NotificationServicesPushControllerState = {
9
- isPushEnabled: boolean;
10
8
  fcmToken: string;
11
9
  };
12
10
  export type NotificationServicesPushControllerGetStateAction = ControllerGetStateAction<typeof controllerName, NotificationServicesPushControllerState>;
@@ -41,23 +39,26 @@ export type Events = NotificationServicesPushControllerStateChangeEvent | Notifi
41
39
  export type AllowedEvents = never;
42
40
  export type NotificationServicesPushControllerMessenger = RestrictedMessenger<typeof controllerName, Actions | AllowedActions, Events | AllowedEvents, AllowedActions['type'], AllowedEvents['type']>;
43
41
  export declare const defaultState: NotificationServicesPushControllerState;
44
- export type ControllerConfig = {
42
+ type ControllerConfig = {
45
43
  /**
46
- * Global switch to determine to use push notifications
47
- * Allows us to control Builds on extension (MV2 vs MV3)
44
+ * Config to turn on/off push notifications.
45
+ * This is currently linked to MV3 builds on extension.
48
46
  */
49
- isPushFeatureEnabled?: boolean;
47
+ isPushEnabled: boolean;
50
48
  /**
51
- * determine the config used for push notification services
49
+ * Must handle when a push notification is received.
50
+ * You must call `registration.showNotification` or equivalent to show the notification on web/mobile
52
51
  */
53
- platform: 'extension' | 'mobile';
52
+ onPushNotificationReceived: (notification: Types.INotification) => void | Promise<void>;
54
53
  /**
55
- * Push Service Interface
56
- * - create reg token
57
- * - delete reg token
58
- * - subscribe to push notifications
54
+ * Must handle when a push notification is clicked.
55
+ * You must call `event.notification.close();` or equivalent for closing and opening notification in a new window.
59
56
  */
60
- pushService: PushService;
57
+ onPushNotificationClicked: (event: NotificationEvent, notification?: Types.INotification) => void;
58
+ /**
59
+ * determine the config used for push notification services
60
+ */
61
+ platform: 'extension' | 'mobile';
61
62
  };
62
63
  /**
63
64
  * Manages push notifications for the application, including enabling, disabling, and updating triggers for push notifications.
@@ -71,8 +72,7 @@ export default class NotificationServicesPushController extends BaseController<t
71
72
  constructor({ messenger, state, env, config, }: {
72
73
  messenger: NotificationServicesPushControllerMessenger;
73
74
  state: NotificationServicesPushControllerState;
74
- /** Push Environment is only required for extension */
75
- env?: PushNotificationEnv;
75
+ env: PushNotificationEnv;
76
76
  config: ControllerConfig;
77
77
  });
78
78
  subscribeToPushNotifications(): Promise<void>;
@@ -85,8 +85,9 @@ export default class NotificationServicesPushController extends BaseController<t
85
85
  * 3. Sending the FCM token to the server responsible for sending notifications, to register the device.
86
86
  *
87
87
  * @param UUIDs - An array of UUIDs to enable push notifications for.
88
+ * @param fcmToken - The optional FCM token to use for push notifications.
88
89
  */
89
- enablePushNotifications(UUIDs: string[]): Promise<void>;
90
+ enablePushNotifications(UUIDs: string[], fcmToken?: string): Promise<void>;
90
91
  /**
91
92
  * Disables push notifications for the application.
92
93
  * This removes the registration token on this device, and ensures we unsubscribe from any listeners
@@ -1 +1 @@
1
- {"version":3,"file":"NotificationServicesPushController.d.mts","sourceRoot":"","sources":["../../src/NotificationServicesPushController/NotificationServicesPushController.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"NotificationServicesPushController.d.mts","sourceRoot":"","sources":["../../src/NotificationServicesPushController/NotificationServicesPushController.ts"],"names":[],"mappings":"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"}
@@ -9,7 +9,7 @@ var __classPrivateFieldGet = (this && this.__classPrivateFieldGet) || function (
9
9
  if (typeof state === "function" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError("Cannot read private member from an object whose class did not declare it");
10
10
  return kind === "m" ? f : kind === "a" ? f.call(receiver) : f ? f.value : state.get(receiver);
11
11
  };
12
- var _NotificationServicesPushController_instances, _NotificationServicesPushController_pushListenerUnsubscribe, _NotificationServicesPushController_env, _NotificationServicesPushController_config, _NotificationServicesPushController_registerMessageHandlers, _NotificationServicesPushController_getAndAssertBearerToken, _NotificationServicesPushController_updatePushState;
12
+ var _NotificationServicesPushController_instances, _NotificationServicesPushController_pushListenerUnsubscribe, _NotificationServicesPushController_env, _NotificationServicesPushController_config, _NotificationServicesPushController_registerMessageHandlers, _NotificationServicesPushController_getAndAssertBearerToken;
13
13
  function $importDefault(module) {
14
14
  if (module?.__esModule) {
15
15
  return module.default;
@@ -19,32 +19,18 @@ function $importDefault(module) {
19
19
  import { BaseController } from "@metamask/base-controller";
20
20
  import $log from "loglevel";
21
21
  const log = $importDefault($log);
22
- import { activatePushNotifications, deactivatePushNotifications, updateTriggerPushNotifications } from "./services/services.mjs";
22
+ import { createRegToken, deleteRegToken } from "./services/push/push-web.mjs";
23
+ import { activatePushNotifications, deactivatePushNotifications, listenToPushNotifications, updateTriggerPushNotifications } from "./services/services.mjs";
23
24
  const controllerName = 'NotificationServicesPushController';
24
25
  export const defaultState = {
25
- isPushEnabled: true,
26
26
  fcmToken: '',
27
27
  };
28
28
  const metadata = {
29
- isPushEnabled: {
30
- persist: true,
31
- anonymous: true,
32
- },
33
29
  fcmToken: {
34
30
  persist: true,
35
31
  anonymous: true,
36
32
  },
37
33
  };
38
- const defaultPushEnv = {
39
- apiKey: '',
40
- authDomain: '',
41
- storageBucket: '',
42
- projectId: '',
43
- messagingSenderId: '',
44
- appId: '',
45
- measurementId: '',
46
- vapidKey: '',
47
- };
48
34
  /**
49
35
  * Manages push notifications for the application, including enabling, disabling, and updating triggers for push notifications.
50
36
  * This controller integrates with Firebase Cloud Messaging (FCM) to handle the registration and management of push notifications.
@@ -64,20 +50,29 @@ class NotificationServicesPushController extends BaseController {
64
50
  _NotificationServicesPushController_pushListenerUnsubscribe.set(this, undefined);
65
51
  _NotificationServicesPushController_env.set(this, void 0);
66
52
  _NotificationServicesPushController_config.set(this, void 0);
67
- __classPrivateFieldSet(this, _NotificationServicesPushController_env, env ?? defaultPushEnv, "f");
53
+ __classPrivateFieldSet(this, _NotificationServicesPushController_env, env, "f");
68
54
  __classPrivateFieldSet(this, _NotificationServicesPushController_config, config, "f");
69
55
  __classPrivateFieldGet(this, _NotificationServicesPushController_instances, "m", _NotificationServicesPushController_registerMessageHandlers).call(this);
70
56
  }
71
57
  async subscribeToPushNotifications() {
72
- if (!__classPrivateFieldGet(this, _NotificationServicesPushController_config, "f").isPushFeatureEnabled) {
73
- return;
74
- }
75
58
  if (__classPrivateFieldGet(this, _NotificationServicesPushController_pushListenerUnsubscribe, "f")) {
76
59
  __classPrivateFieldGet(this, _NotificationServicesPushController_pushListenerUnsubscribe, "f").call(this);
77
60
  __classPrivateFieldSet(this, _NotificationServicesPushController_pushListenerUnsubscribe, undefined, "f");
78
61
  }
79
62
  try {
80
- __classPrivateFieldSet(this, _NotificationServicesPushController_pushListenerUnsubscribe, (await __classPrivateFieldGet(this, _NotificationServicesPushController_config, "f").pushService.subscribeToPushNotifications(__classPrivateFieldGet(this, _NotificationServicesPushController_env, "f"))) ?? undefined, "f");
63
+ __classPrivateFieldSet(this, _NotificationServicesPushController_pushListenerUnsubscribe, await listenToPushNotifications({
64
+ env: __classPrivateFieldGet(this, _NotificationServicesPushController_env, "f"),
65
+ listenToPushReceived: async (n) => {
66
+ this.messagingSystem.publish('NotificationServicesPushController:onNewNotifications', n);
67
+ await __classPrivateFieldGet(this, _NotificationServicesPushController_config, "f").onPushNotificationReceived(n);
68
+ },
69
+ listenToPushClicked: (e, n) => {
70
+ if (n) {
71
+ this.messagingSystem.publish('NotificationServicesPushController:pushNotificationClicked', n);
72
+ }
73
+ __classPrivateFieldGet(this, _NotificationServicesPushController_config, "f").onPushNotificationClicked(e, n);
74
+ },
75
+ }), "f");
81
76
  }
82
77
  catch {
83
78
  // Do nothing, we are silently failing if push notification registration fails
@@ -92,9 +87,10 @@ class NotificationServicesPushController extends BaseController {
92
87
  * 3. Sending the FCM token to the server responsible for sending notifications, to register the device.
93
88
  *
94
89
  * @param UUIDs - An array of UUIDs to enable push notifications for.
90
+ * @param fcmToken - The optional FCM token to use for push notifications.
95
91
  */
96
- async enablePushNotifications(UUIDs) {
97
- if (!__classPrivateFieldGet(this, _NotificationServicesPushController_config, "f").isPushFeatureEnabled) {
92
+ async enablePushNotifications(UUIDs, fcmToken) {
93
+ if (!__classPrivateFieldGet(this, _NotificationServicesPushController_config, "f").isPushEnabled) {
98
94
  return;
99
95
  }
100
96
  // Handle creating new reg token (if available)
@@ -103,15 +99,18 @@ class NotificationServicesPushController extends BaseController {
103
99
  // If there is a bearer token, lets try to refresh/create new reg token
104
100
  if (bearerToken) {
105
101
  // Activate Push Notifications
106
- const fcmToken = await activatePushNotifications({
102
+ const regToken = await activatePushNotifications({
107
103
  bearerToken,
108
104
  triggers: UUIDs,
109
105
  env: __classPrivateFieldGet(this, _NotificationServicesPushController_env, "f"),
110
- createRegToken: __classPrivateFieldGet(this, _NotificationServicesPushController_config, "f").pushService.createRegToken,
106
+ fcmToken,
107
+ createRegToken,
111
108
  platform: __classPrivateFieldGet(this, _NotificationServicesPushController_config, "f").platform,
112
109
  }).catch(() => null);
113
- if (fcmToken) {
114
- __classPrivateFieldGet(this, _NotificationServicesPushController_instances, "m", _NotificationServicesPushController_updatePushState).call(this, { type: 'enable', fcmToken });
110
+ if (regToken) {
111
+ this.update((state) => {
112
+ state.fcmToken = regToken;
113
+ });
115
114
  }
116
115
  }
117
116
  }
@@ -126,14 +125,15 @@ class NotificationServicesPushController extends BaseController {
126
125
  * This removes the registration token on this device, and ensures we unsubscribe from any listeners
127
126
  */
128
127
  async disablePushNotifications() {
129
- if (!__classPrivateFieldGet(this, _NotificationServicesPushController_config, "f").isPushFeatureEnabled) {
128
+ if (!__classPrivateFieldGet(this, _NotificationServicesPushController_config, "f").isPushEnabled) {
130
129
  return;
131
130
  }
131
+ let isPushNotificationsDisabled;
132
132
  try {
133
133
  // Send a request to the server to unregister the token/device
134
- await deactivatePushNotifications({
134
+ isPushNotificationsDisabled = await deactivatePushNotifications({
135
135
  env: __classPrivateFieldGet(this, _NotificationServicesPushController_env, "f"),
136
- deleteRegToken: __classPrivateFieldGet(this, _NotificationServicesPushController_config, "f").pushService.deleteRegToken,
136
+ deleteRegToken,
137
137
  regToken: this.state.fcmToken,
138
138
  });
139
139
  }
@@ -142,10 +142,18 @@ class NotificationServicesPushController extends BaseController {
142
142
  log.error(errorMessage);
143
143
  throw new Error(errorMessage);
144
144
  }
145
+ // Remove the FCM token from the state
146
+ if (!isPushNotificationsDisabled) {
147
+ return;
148
+ }
145
149
  // Unsubscribe from push notifications
146
150
  __classPrivateFieldGet(this, _NotificationServicesPushController_pushListenerUnsubscribe, "f")?.call(this);
147
151
  // Update State
148
- __classPrivateFieldGet(this, _NotificationServicesPushController_instances, "m", _NotificationServicesPushController_updatePushState).call(this, { type: 'disable' });
152
+ if (isPushNotificationsDisabled) {
153
+ this.update((state) => {
154
+ state.fcmToken = '';
155
+ });
156
+ }
149
157
  }
150
158
  /**
151
159
  * Updates the triggers for push notifications.
@@ -155,7 +163,7 @@ class NotificationServicesPushController extends BaseController {
155
163
  * @param UUIDs - An array of UUIDs that should trigger push notifications.
156
164
  */
157
165
  async updateTriggerPushNotifications(UUIDs) {
158
- if (!__classPrivateFieldGet(this, _NotificationServicesPushController_config, "f").isPushFeatureEnabled) {
166
+ if (!__classPrivateFieldGet(this, _NotificationServicesPushController_config, "f").isPushEnabled) {
159
167
  return;
160
168
  }
161
169
  const bearerToken = await __classPrivateFieldGet(this, _NotificationServicesPushController_instances, "m", _NotificationServicesPushController_getAndAssertBearerToken).call(this);
@@ -164,13 +172,15 @@ class NotificationServicesPushController extends BaseController {
164
172
  bearerToken,
165
173
  triggers: UUIDs,
166
174
  env: __classPrivateFieldGet(this, _NotificationServicesPushController_env, "f"),
167
- createRegToken: __classPrivateFieldGet(this, _NotificationServicesPushController_config, "f").pushService.createRegToken,
168
- deleteRegToken: __classPrivateFieldGet(this, _NotificationServicesPushController_config, "f").pushService.deleteRegToken,
175
+ createRegToken,
176
+ deleteRegToken,
169
177
  platform: __classPrivateFieldGet(this, _NotificationServicesPushController_config, "f").platform,
170
178
  });
171
179
  // update the state with the new FCM token
172
180
  if (fcmToken) {
173
- __classPrivateFieldGet(this, _NotificationServicesPushController_instances, "m", _NotificationServicesPushController_updatePushState).call(this, { type: 'update', fcmToken });
181
+ this.update((state) => {
182
+ state.fcmToken = fcmToken;
183
+ });
174
184
  }
175
185
  }
176
186
  catch (error) {
@@ -192,25 +202,6 @@ _NotificationServicesPushController_pushListenerUnsubscribe = new WeakMap(), _No
192
202
  throw new Error('BearerToken token is missing');
193
203
  }
194
204
  return bearerToken;
195
- }, _NotificationServicesPushController_updatePushState = function _NotificationServicesPushController_updatePushState(command) {
196
- if (command.type === 'enable') {
197
- this.update((state) => {
198
- state.isPushEnabled = true;
199
- state.fcmToken = command.fcmToken;
200
- });
201
- }
202
- if (command.type === 'disable') {
203
- this.update((state) => {
204
- state.isPushEnabled = false;
205
- state.fcmToken = '';
206
- });
207
- }
208
- if (command.type === 'update') {
209
- this.update((state) => {
210
- state.isPushEnabled = true;
211
- state.fcmToken = command.fcmToken;
212
- });
213
- }
214
205
  };
215
206
  export default NotificationServicesPushController;
216
207
  //# sourceMappingURL=NotificationServicesPushController.mjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"NotificationServicesPushController.mjs","sourceRoot":"","sources":["../../src/NotificationServicesPushController/NotificationServicesPushController.ts"],"names":[],"mappings":"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","sourcesContent":["import type {\n RestrictedMessenger,\n ControllerGetStateAction,\n ControllerStateChangeEvent,\n StateMetadata,\n} from '@metamask/base-controller';\nimport { BaseController } from '@metamask/base-controller';\nimport type { AuthenticationController } from '@metamask/profile-sync-controller';\nimport log from 'loglevel';\n\nimport {\n activatePushNotifications,\n deactivatePushNotifications,\n updateTriggerPushNotifications,\n} from './services/services';\nimport type { PushNotificationEnv } from './types';\nimport type { PushService } from './types/push-service-interface';\nimport type { Types } from '../NotificationServicesController';\n\nconst controllerName = 'NotificationServicesPushController';\n\nexport type NotificationServicesPushControllerState = {\n isPushEnabled: boolean;\n fcmToken: string;\n};\n\nexport type NotificationServicesPushControllerGetStateAction =\n ControllerGetStateAction<\n typeof controllerName,\n NotificationServicesPushControllerState\n >;\n\nexport type NotificationServicesPushControllerEnablePushNotificationsAction = {\n type: `${typeof controllerName}:enablePushNotifications`;\n handler: NotificationServicesPushController['enablePushNotifications'];\n};\nexport type NotificationServicesPushControllerDisablePushNotificationsAction = {\n type: `${typeof controllerName}:disablePushNotifications`;\n handler: NotificationServicesPushController['disablePushNotifications'];\n};\nexport type NotificationServicesPushControllerUpdateTriggerPushNotificationsAction =\n {\n type: `${typeof controllerName}:updateTriggerPushNotifications`;\n handler: NotificationServicesPushController['updateTriggerPushNotifications'];\n };\nexport type NotificationServicesPushControllerSubscribeToNotificationsAction = {\n type: `${typeof controllerName}:subscribeToPushNotifications`;\n handler: NotificationServicesPushController['subscribeToPushNotifications'];\n};\n\nexport type Actions =\n | NotificationServicesPushControllerGetStateAction\n | NotificationServicesPushControllerEnablePushNotificationsAction\n | NotificationServicesPushControllerDisablePushNotificationsAction\n | NotificationServicesPushControllerUpdateTriggerPushNotificationsAction\n | NotificationServicesPushControllerSubscribeToNotificationsAction;\n\nexport type AllowedActions =\n AuthenticationController.AuthenticationControllerGetBearerToken;\n\nexport type NotificationServicesPushControllerStateChangeEvent =\n ControllerStateChangeEvent<\n typeof controllerName,\n NotificationServicesPushControllerState\n >;\n\nexport type NotificationServicesPushControllerOnNewNotificationEvent = {\n type: `${typeof controllerName}:onNewNotifications`;\n payload: [Types.INotification];\n};\n\nexport type NotificationServicesPushControllerPushNotificationClickedEvent = {\n type: `${typeof controllerName}:pushNotificationClicked`;\n payload: [Types.INotification];\n};\n\nexport type Events =\n | NotificationServicesPushControllerStateChangeEvent\n | NotificationServicesPushControllerOnNewNotificationEvent\n | NotificationServicesPushControllerPushNotificationClickedEvent;\n\nexport type AllowedEvents = never;\n\nexport type NotificationServicesPushControllerMessenger = RestrictedMessenger<\n typeof controllerName,\n Actions | AllowedActions,\n Events | AllowedEvents,\n AllowedActions['type'],\n AllowedEvents['type']\n>;\n\nexport const defaultState: NotificationServicesPushControllerState = {\n isPushEnabled: true,\n fcmToken: '',\n};\nconst metadata: StateMetadata<NotificationServicesPushControllerState> = {\n isPushEnabled: {\n persist: true,\n anonymous: true,\n },\n fcmToken: {\n persist: true,\n anonymous: true,\n },\n};\n\nconst defaultPushEnv: PushNotificationEnv = {\n apiKey: '',\n authDomain: '',\n storageBucket: '',\n projectId: '',\n messagingSenderId: '',\n appId: '',\n measurementId: '',\n vapidKey: '',\n};\n\nexport type ControllerConfig = {\n /**\n * Global switch to determine to use push notifications\n * Allows us to control Builds on extension (MV2 vs MV3)\n */\n isPushFeatureEnabled?: boolean;\n\n /**\n * determine the config used for push notification services\n */\n platform: 'extension' | 'mobile';\n\n /**\n * Push Service Interface\n * - create reg token\n * - delete reg token\n * - subscribe to push notifications\n */\n pushService: PushService;\n};\n\ntype StateCommand =\n | { type: 'enable'; fcmToken: string }\n | { type: 'disable' }\n | { type: 'update'; fcmToken: string };\n\n/**\n * Manages push notifications for the application, including enabling, disabling, and updating triggers for push notifications.\n * This controller integrates with Firebase Cloud Messaging (FCM) to handle the registration and management of push notifications.\n * It is responsible for registering and unregistering the service worker that listens for push notifications,\n * managing the FCM token, and communicating with the server to register or unregister the device for push notifications.\n * Additionally, it provides functionality to update the server with new UUIDs that should trigger push notifications.\n */\nexport default class NotificationServicesPushController extends BaseController<\n typeof controllerName,\n NotificationServicesPushControllerState,\n NotificationServicesPushControllerMessenger\n> {\n #pushListenerUnsubscribe: (() => void) | undefined = undefined;\n\n readonly #env: PushNotificationEnv;\n\n readonly #config: ControllerConfig;\n\n constructor({\n messenger,\n state,\n env,\n config,\n }: {\n messenger: NotificationServicesPushControllerMessenger;\n state: NotificationServicesPushControllerState;\n /** Push Environment is only required for extension */\n env?: PushNotificationEnv;\n config: ControllerConfig;\n }) {\n super({\n messenger,\n metadata,\n name: controllerName,\n state: { ...defaultState, ...state },\n });\n\n this.#env = env ?? defaultPushEnv;\n this.#config = config;\n\n this.#registerMessageHandlers();\n }\n\n #registerMessageHandlers(): void {\n this.messagingSystem.registerActionHandler(\n 'NotificationServicesPushController:enablePushNotifications',\n this.enablePushNotifications.bind(this),\n );\n this.messagingSystem.registerActionHandler(\n 'NotificationServicesPushController:disablePushNotifications',\n this.disablePushNotifications.bind(this),\n );\n this.messagingSystem.registerActionHandler(\n 'NotificationServicesPushController:updateTriggerPushNotifications',\n this.updateTriggerPushNotifications.bind(this),\n );\n this.messagingSystem.registerActionHandler(\n 'NotificationServicesPushController:subscribeToPushNotifications',\n this.subscribeToPushNotifications.bind(this),\n );\n }\n\n async #getAndAssertBearerToken() {\n const bearerToken = await this.messagingSystem.call(\n 'AuthenticationController:getBearerToken',\n );\n if (!bearerToken) {\n log.error(\n 'Failed to enable push notifications: BearerToken token is missing.',\n );\n throw new Error('BearerToken token is missing');\n }\n\n return bearerToken;\n }\n\n #updatePushState(command: StateCommand) {\n if (command.type === 'enable') {\n this.update((state) => {\n state.isPushEnabled = true;\n state.fcmToken = command.fcmToken;\n });\n }\n\n if (command.type === 'disable') {\n this.update((state) => {\n state.isPushEnabled = false;\n state.fcmToken = '';\n });\n }\n\n if (command.type === 'update') {\n this.update((state) => {\n state.isPushEnabled = true;\n state.fcmToken = command.fcmToken;\n });\n }\n }\n\n async subscribeToPushNotifications() {\n if (!this.#config.isPushFeatureEnabled) {\n return;\n }\n\n if (this.#pushListenerUnsubscribe) {\n this.#pushListenerUnsubscribe();\n this.#pushListenerUnsubscribe = undefined;\n }\n\n try {\n this.#pushListenerUnsubscribe =\n (await this.#config.pushService.subscribeToPushNotifications(\n this.#env,\n )) ?? undefined;\n } catch {\n // Do nothing, we are silently failing if push notification registration fails\n }\n }\n\n /**\n * Enables push notifications for the application.\n *\n * This method sets up the necessary infrastructure for handling push notifications by:\n * 1. Registering the service worker to listen for messages.\n * 2. Fetching the Firebase Cloud Messaging (FCM) token from Firebase.\n * 3. Sending the FCM token to the server responsible for sending notifications, to register the device.\n *\n * @param UUIDs - An array of UUIDs to enable push notifications for.\n */\n async enablePushNotifications(UUIDs: string[]) {\n if (!this.#config.isPushFeatureEnabled) {\n return;\n }\n\n // Handle creating new reg token (if available)\n try {\n const bearerToken = await this.#getAndAssertBearerToken().catch(\n () => null,\n );\n\n // If there is a bearer token, lets try to refresh/create new reg token\n if (bearerToken) {\n // Activate Push Notifications\n const fcmToken = await activatePushNotifications({\n bearerToken,\n triggers: UUIDs,\n env: this.#env,\n createRegToken: this.#config.pushService.createRegToken,\n platform: this.#config.platform,\n }).catch(() => null);\n\n if (fcmToken) {\n this.#updatePushState({ type: 'enable', fcmToken });\n }\n }\n } catch {\n // Do nothing, we are silently failing\n }\n\n // New token created, (re)subscribe to push notifications\n await this.subscribeToPushNotifications();\n }\n\n /**\n * Disables push notifications for the application.\n * This removes the registration token on this device, and ensures we unsubscribe from any listeners\n */\n async disablePushNotifications() {\n if (!this.#config.isPushFeatureEnabled) {\n return;\n }\n\n try {\n // Send a request to the server to unregister the token/device\n await deactivatePushNotifications({\n env: this.#env,\n deleteRegToken: this.#config.pushService.deleteRegToken,\n regToken: this.state.fcmToken,\n });\n } catch (error) {\n const errorMessage = `Failed to disable push notifications: ${\n error as string\n }`;\n log.error(errorMessage);\n throw new Error(errorMessage);\n }\n\n // Unsubscribe from push notifications\n this.#pushListenerUnsubscribe?.();\n\n // Update State\n this.#updatePushState({ type: 'disable' });\n }\n\n /**\n * Updates the triggers for push notifications.\n * This method is responsible for updating the server with the new set of UUIDs that should trigger push notifications.\n * It uses the current FCM token and a BearerToken for authentication.\n *\n * @param UUIDs - An array of UUIDs that should trigger push notifications.\n */\n async updateTriggerPushNotifications(UUIDs: string[]) {\n if (!this.#config.isPushFeatureEnabled) {\n return;\n }\n\n const bearerToken = await this.#getAndAssertBearerToken();\n\n try {\n const { fcmToken } = await updateTriggerPushNotifications({\n bearerToken,\n triggers: UUIDs,\n env: this.#env,\n createRegToken: this.#config.pushService.createRegToken,\n deleteRegToken: this.#config.pushService.deleteRegToken,\n platform: this.#config.platform,\n });\n\n // update the state with the new FCM token\n if (fcmToken) {\n this.#updatePushState({ type: 'update', fcmToken });\n }\n } catch (error) {\n const errorMessage = `Failed to update triggers for push notifications: ${\n error as string\n }`;\n log.error(errorMessage);\n throw new Error(errorMessage);\n }\n }\n}\n"]}
1
+ {"version":3,"file":"NotificationServicesPushController.mjs","sourceRoot":"","sources":["../../src/NotificationServicesPushController/NotificationServicesPushController.ts"],"names":[],"mappings":"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","sourcesContent":["import type {\n RestrictedMessenger,\n ControllerGetStateAction,\n ControllerStateChangeEvent,\n StateMetadata,\n} from '@metamask/base-controller';\nimport { BaseController } from '@metamask/base-controller';\nimport type { AuthenticationController } from '@metamask/profile-sync-controller';\nimport log from 'loglevel';\n\nimport { createRegToken, deleteRegToken } from './services/push/push-web';\nimport {\n activatePushNotifications,\n deactivatePushNotifications,\n listenToPushNotifications,\n updateTriggerPushNotifications,\n} from './services/services';\nimport type { PushNotificationEnv } from './types';\nimport type { Types } from '../NotificationServicesController';\n\nconst controllerName = 'NotificationServicesPushController';\n\nexport type NotificationServicesPushControllerState = {\n fcmToken: string;\n};\n\nexport type NotificationServicesPushControllerGetStateAction =\n ControllerGetStateAction<\n typeof controllerName,\n NotificationServicesPushControllerState\n >;\n\nexport type NotificationServicesPushControllerEnablePushNotificationsAction = {\n type: `${typeof controllerName}:enablePushNotifications`;\n handler: NotificationServicesPushController['enablePushNotifications'];\n};\nexport type NotificationServicesPushControllerDisablePushNotificationsAction = {\n type: `${typeof controllerName}:disablePushNotifications`;\n handler: NotificationServicesPushController['disablePushNotifications'];\n};\nexport type NotificationServicesPushControllerUpdateTriggerPushNotificationsAction =\n {\n type: `${typeof controllerName}:updateTriggerPushNotifications`;\n handler: NotificationServicesPushController['updateTriggerPushNotifications'];\n };\nexport type NotificationServicesPushControllerSubscribeToNotificationsAction = {\n type: `${typeof controllerName}:subscribeToPushNotifications`;\n handler: NotificationServicesPushController['subscribeToPushNotifications'];\n};\n\nexport type Actions =\n | NotificationServicesPushControllerGetStateAction\n | NotificationServicesPushControllerEnablePushNotificationsAction\n | NotificationServicesPushControllerDisablePushNotificationsAction\n | NotificationServicesPushControllerUpdateTriggerPushNotificationsAction\n | NotificationServicesPushControllerSubscribeToNotificationsAction;\n\nexport type AllowedActions =\n AuthenticationController.AuthenticationControllerGetBearerToken;\n\nexport type NotificationServicesPushControllerStateChangeEvent =\n ControllerStateChangeEvent<\n typeof controllerName,\n NotificationServicesPushControllerState\n >;\n\nexport type NotificationServicesPushControllerOnNewNotificationEvent = {\n type: `${typeof controllerName}:onNewNotifications`;\n payload: [Types.INotification];\n};\n\nexport type NotificationServicesPushControllerPushNotificationClickedEvent = {\n type: `${typeof controllerName}:pushNotificationClicked`;\n payload: [Types.INotification];\n};\n\nexport type Events =\n | NotificationServicesPushControllerStateChangeEvent\n | NotificationServicesPushControllerOnNewNotificationEvent\n | NotificationServicesPushControllerPushNotificationClickedEvent;\n\nexport type AllowedEvents = never;\n\nexport type NotificationServicesPushControllerMessenger = RestrictedMessenger<\n typeof controllerName,\n Actions | AllowedActions,\n Events | AllowedEvents,\n AllowedActions['type'],\n AllowedEvents['type']\n>;\n\nexport const defaultState: NotificationServicesPushControllerState = {\n fcmToken: '',\n};\nconst metadata: StateMetadata<NotificationServicesPushControllerState> = {\n fcmToken: {\n persist: true,\n anonymous: true,\n },\n};\n\ntype ControllerConfig = {\n /**\n * Config to turn on/off push notifications.\n * This is currently linked to MV3 builds on extension.\n */\n isPushEnabled: boolean;\n\n /**\n * Must handle when a push notification is received.\n * You must call `registration.showNotification` or equivalent to show the notification on web/mobile\n */\n onPushNotificationReceived: (\n notification: Types.INotification,\n ) => void | Promise<void>;\n\n /**\n * Must handle when a push notification is clicked.\n * You must call `event.notification.close();` or equivalent for closing and opening notification in a new window.\n */\n onPushNotificationClicked: (\n event: NotificationEvent,\n notification?: Types.INotification,\n ) => void;\n\n /**\n * determine the config used for push notification services\n */\n platform: 'extension' | 'mobile';\n};\n\n/**\n * Manages push notifications for the application, including enabling, disabling, and updating triggers for push notifications.\n * This controller integrates with Firebase Cloud Messaging (FCM) to handle the registration and management of push notifications.\n * It is responsible for registering and unregistering the service worker that listens for push notifications,\n * managing the FCM token, and communicating with the server to register or unregister the device for push notifications.\n * Additionally, it provides functionality to update the server with new UUIDs that should trigger push notifications.\n */\nexport default class NotificationServicesPushController extends BaseController<\n typeof controllerName,\n NotificationServicesPushControllerState,\n NotificationServicesPushControllerMessenger\n> {\n #pushListenerUnsubscribe: (() => void) | undefined = undefined;\n\n readonly #env: PushNotificationEnv;\n\n readonly #config: ControllerConfig;\n\n constructor({\n messenger,\n state,\n env,\n config,\n }: {\n messenger: NotificationServicesPushControllerMessenger;\n state: NotificationServicesPushControllerState;\n env: PushNotificationEnv;\n config: ControllerConfig;\n }) {\n super({\n messenger,\n metadata,\n name: controllerName,\n state: { ...defaultState, ...state },\n });\n\n this.#env = env;\n this.#config = config;\n\n this.#registerMessageHandlers();\n }\n\n #registerMessageHandlers(): void {\n this.messagingSystem.registerActionHandler(\n 'NotificationServicesPushController:enablePushNotifications',\n this.enablePushNotifications.bind(this),\n );\n this.messagingSystem.registerActionHandler(\n 'NotificationServicesPushController:disablePushNotifications',\n this.disablePushNotifications.bind(this),\n );\n this.messagingSystem.registerActionHandler(\n 'NotificationServicesPushController:updateTriggerPushNotifications',\n this.updateTriggerPushNotifications.bind(this),\n );\n this.messagingSystem.registerActionHandler(\n 'NotificationServicesPushController:subscribeToPushNotifications',\n this.subscribeToPushNotifications.bind(this),\n );\n }\n\n async #getAndAssertBearerToken() {\n const bearerToken = await this.messagingSystem.call(\n 'AuthenticationController:getBearerToken',\n );\n if (!bearerToken) {\n log.error(\n 'Failed to enable push notifications: BearerToken token is missing.',\n );\n throw new Error('BearerToken token is missing');\n }\n\n return bearerToken;\n }\n\n async subscribeToPushNotifications() {\n if (this.#pushListenerUnsubscribe) {\n this.#pushListenerUnsubscribe();\n this.#pushListenerUnsubscribe = undefined;\n }\n\n try {\n this.#pushListenerUnsubscribe = await listenToPushNotifications({\n env: this.#env,\n listenToPushReceived: async (n) => {\n this.messagingSystem.publish(\n 'NotificationServicesPushController:onNewNotifications',\n n,\n );\n await this.#config.onPushNotificationReceived(n);\n },\n listenToPushClicked: (e, n) => {\n if (n) {\n this.messagingSystem.publish(\n 'NotificationServicesPushController:pushNotificationClicked',\n n,\n );\n }\n\n this.#config.onPushNotificationClicked(e, n);\n },\n });\n } catch {\n // Do nothing, we are silently failing if push notification registration fails\n }\n }\n\n /**\n * Enables push notifications for the application.\n *\n * This method sets up the necessary infrastructure for handling push notifications by:\n * 1. Registering the service worker to listen for messages.\n * 2. Fetching the Firebase Cloud Messaging (FCM) token from Firebase.\n * 3. Sending the FCM token to the server responsible for sending notifications, to register the device.\n *\n * @param UUIDs - An array of UUIDs to enable push notifications for.\n * @param fcmToken - The optional FCM token to use for push notifications.\n */\n async enablePushNotifications(UUIDs: string[], fcmToken?: string) {\n if (!this.#config.isPushEnabled) {\n return;\n }\n\n // Handle creating new reg token (if available)\n try {\n const bearerToken = await this.#getAndAssertBearerToken().catch(\n () => null,\n );\n\n // If there is a bearer token, lets try to refresh/create new reg token\n if (bearerToken) {\n // Activate Push Notifications\n const regToken = await activatePushNotifications({\n bearerToken,\n triggers: UUIDs,\n env: this.#env,\n fcmToken,\n createRegToken,\n platform: this.#config.platform,\n }).catch(() => null);\n\n if (regToken) {\n this.update((state) => {\n state.fcmToken = regToken;\n });\n }\n }\n } catch {\n // Do nothing, we are silently failing\n }\n\n // New token created, (re)subscribe to push notifications\n await this.subscribeToPushNotifications();\n }\n\n /**\n * Disables push notifications for the application.\n * This removes the registration token on this device, and ensures we unsubscribe from any listeners\n */\n async disablePushNotifications() {\n if (!this.#config.isPushEnabled) {\n return;\n }\n\n let isPushNotificationsDisabled: boolean;\n\n try {\n // Send a request to the server to unregister the token/device\n isPushNotificationsDisabled = await deactivatePushNotifications({\n env: this.#env,\n deleteRegToken,\n regToken: this.state.fcmToken,\n });\n } catch (error) {\n const errorMessage = `Failed to disable push notifications: ${\n error as string\n }`;\n log.error(errorMessage);\n throw new Error(errorMessage);\n }\n\n // Remove the FCM token from the state\n if (!isPushNotificationsDisabled) {\n return;\n }\n\n // Unsubscribe from push notifications\n this.#pushListenerUnsubscribe?.();\n\n // Update State\n if (isPushNotificationsDisabled) {\n this.update((state) => {\n state.fcmToken = '';\n });\n }\n }\n\n /**\n * Updates the triggers for push notifications.\n * This method is responsible for updating the server with the new set of UUIDs that should trigger push notifications.\n * It uses the current FCM token and a BearerToken for authentication.\n *\n * @param UUIDs - An array of UUIDs that should trigger push notifications.\n */\n async updateTriggerPushNotifications(UUIDs: string[]) {\n if (!this.#config.isPushEnabled) {\n return;\n }\n\n const bearerToken = await this.#getAndAssertBearerToken();\n\n try {\n const { fcmToken } = await updateTriggerPushNotifications({\n bearerToken,\n triggers: UUIDs,\n env: this.#env,\n createRegToken,\n deleteRegToken,\n platform: this.#config.platform,\n });\n\n // update the state with the new FCM token\n if (fcmToken) {\n this.update((state) => {\n state.fcmToken = fcmToken;\n });\n }\n } catch (error) {\n const errorMessage = `Failed to update triggers for push notifications: ${\n error as string\n }`;\n log.error(errorMessage);\n throw new Error(errorMessage);\n }\n }\n}\n"]}
@@ -0,0 +1,14 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.VAPID_KEY = exports.FIREBASE_MEASUREMENT_ID = exports.FIREBASE_APP_ID = exports.FIREBASE_MESSAGING_SENDER_ID = exports.FIREBASE_PROJECT_ID = exports.FIREBASE_STORAGE_BUCKET = exports.FIREBASE_AUTH_DOMAIN = exports.FIREBASE_API_KEY = exports.PUSH_NOTIFICATIONS_SERVICE_URL = exports.ENABLE_MV3 = void 0;
4
+ exports.ENABLE_MV3 = true;
5
+ exports.PUSH_NOTIFICATIONS_SERVICE_URL = 'https://push.api.cx.metamask.io';
6
+ exports.FIREBASE_API_KEY = '';
7
+ exports.FIREBASE_AUTH_DOMAIN = '';
8
+ exports.FIREBASE_STORAGE_BUCKET = '';
9
+ exports.FIREBASE_PROJECT_ID = '';
10
+ exports.FIREBASE_MESSAGING_SENDER_ID = '';
11
+ exports.FIREBASE_APP_ID = '';
12
+ exports.FIREBASE_MEASUREMENT_ID = '';
13
+ exports.VAPID_KEY = '';
14
+ //# sourceMappingURL=constants.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"constants.cjs","sourceRoot":"","sources":["../../src/NotificationServicesPushController/constants.ts"],"names":[],"mappings":";;;AAAa,QAAA,UAAU,GAAG,IAAI,CAAC;AAClB,QAAA,8BAA8B,GAAG,iCAAiC,CAAC;AAEnE,QAAA,gBAAgB,GAAG,EAAE,CAAC;AACtB,QAAA,oBAAoB,GAAG,EAAE,CAAC;AAC1B,QAAA,uBAAuB,GAAG,EAAE,CAAC;AAC7B,QAAA,mBAAmB,GAAG,EAAE,CAAC;AACzB,QAAA,4BAA4B,GAAG,EAAE,CAAC;AAClC,QAAA,eAAe,GAAG,EAAE,CAAC;AACrB,QAAA,uBAAuB,GAAG,EAAE,CAAC;AAC7B,QAAA,SAAS,GAAG,EAAE,CAAC","sourcesContent":["export const ENABLE_MV3 = true;\nexport const PUSH_NOTIFICATIONS_SERVICE_URL = 'https://push.api.cx.metamask.io';\n\nexport const FIREBASE_API_KEY = '';\nexport const FIREBASE_AUTH_DOMAIN = '';\nexport const FIREBASE_STORAGE_BUCKET = '';\nexport const FIREBASE_PROJECT_ID = '';\nexport const FIREBASE_MESSAGING_SENDER_ID = '';\nexport const FIREBASE_APP_ID = '';\nexport const FIREBASE_MEASUREMENT_ID = '';\nexport const VAPID_KEY = '';\n"]}
@@ -0,0 +1,11 @@
1
+ export declare const ENABLE_MV3 = true;
2
+ export declare const PUSH_NOTIFICATIONS_SERVICE_URL = "https://push.api.cx.metamask.io";
3
+ export declare const FIREBASE_API_KEY = "";
4
+ export declare const FIREBASE_AUTH_DOMAIN = "";
5
+ export declare const FIREBASE_STORAGE_BUCKET = "";
6
+ export declare const FIREBASE_PROJECT_ID = "";
7
+ export declare const FIREBASE_MESSAGING_SENDER_ID = "";
8
+ export declare const FIREBASE_APP_ID = "";
9
+ export declare const FIREBASE_MEASUREMENT_ID = "";
10
+ export declare const VAPID_KEY = "";
11
+ //# sourceMappingURL=constants.d.cts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"constants.d.cts","sourceRoot":"","sources":["../../src/NotificationServicesPushController/constants.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,UAAU,OAAO,CAAC;AAC/B,eAAO,MAAM,8BAA8B,oCAAoC,CAAC;AAEhF,eAAO,MAAM,gBAAgB,KAAK,CAAC;AACnC,eAAO,MAAM,oBAAoB,KAAK,CAAC;AACvC,eAAO,MAAM,uBAAuB,KAAK,CAAC;AAC1C,eAAO,MAAM,mBAAmB,KAAK,CAAC;AACtC,eAAO,MAAM,4BAA4B,KAAK,CAAC;AAC/C,eAAO,MAAM,eAAe,KAAK,CAAC;AAClC,eAAO,MAAM,uBAAuB,KAAK,CAAC;AAC1C,eAAO,MAAM,SAAS,KAAK,CAAC"}
@@ -0,0 +1,11 @@
1
+ export declare const ENABLE_MV3 = true;
2
+ export declare const PUSH_NOTIFICATIONS_SERVICE_URL = "https://push.api.cx.metamask.io";
3
+ export declare const FIREBASE_API_KEY = "";
4
+ export declare const FIREBASE_AUTH_DOMAIN = "";
5
+ export declare const FIREBASE_STORAGE_BUCKET = "";
6
+ export declare const FIREBASE_PROJECT_ID = "";
7
+ export declare const FIREBASE_MESSAGING_SENDER_ID = "";
8
+ export declare const FIREBASE_APP_ID = "";
9
+ export declare const FIREBASE_MEASUREMENT_ID = "";
10
+ export declare const VAPID_KEY = "";
11
+ //# sourceMappingURL=constants.d.mts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"constants.d.mts","sourceRoot":"","sources":["../../src/NotificationServicesPushController/constants.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,UAAU,OAAO,CAAC;AAC/B,eAAO,MAAM,8BAA8B,oCAAoC,CAAC;AAEhF,eAAO,MAAM,gBAAgB,KAAK,CAAC;AACnC,eAAO,MAAM,oBAAoB,KAAK,CAAC;AACvC,eAAO,MAAM,uBAAuB,KAAK,CAAC;AAC1C,eAAO,MAAM,mBAAmB,KAAK,CAAC;AACtC,eAAO,MAAM,4BAA4B,KAAK,CAAC;AAC/C,eAAO,MAAM,eAAe,KAAK,CAAC;AAClC,eAAO,MAAM,uBAAuB,KAAK,CAAC;AAC1C,eAAO,MAAM,SAAS,KAAK,CAAC"}
@@ -0,0 +1,11 @@
1
+ export const ENABLE_MV3 = true;
2
+ export const PUSH_NOTIFICATIONS_SERVICE_URL = 'https://push.api.cx.metamask.io';
3
+ export const FIREBASE_API_KEY = '';
4
+ export const FIREBASE_AUTH_DOMAIN = '';
5
+ export const FIREBASE_STORAGE_BUCKET = '';
6
+ export const FIREBASE_PROJECT_ID = '';
7
+ export const FIREBASE_MESSAGING_SENDER_ID = '';
8
+ export const FIREBASE_APP_ID = '';
9
+ export const FIREBASE_MEASUREMENT_ID = '';
10
+ export const VAPID_KEY = '';
11
+ //# sourceMappingURL=constants.mjs.map