@metamask-previews/notification-services-controller 0.10.0-preview-557a8fcb → 0.11.0-preview-257618a8

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 (88) hide show
  1. package/CHANGELOG.md +22 -1
  2. package/dist/NotificationServicesController/NotificationServicesController.cjs +87 -10
  3. package/dist/NotificationServicesController/NotificationServicesController.cjs.map +1 -1
  4. package/dist/NotificationServicesController/NotificationServicesController.d.cts +36 -1
  5. package/dist/NotificationServicesController/NotificationServicesController.d.cts.map +1 -1
  6. package/dist/NotificationServicesController/NotificationServicesController.d.mts +36 -1
  7. package/dist/NotificationServicesController/NotificationServicesController.d.mts.map +1 -1
  8. package/dist/NotificationServicesController/NotificationServicesController.mjs +87 -10
  9. package/dist/NotificationServicesController/NotificationServicesController.mjs.map +1 -1
  10. package/dist/NotificationServicesController/__fixtures__/index.cjs +1 -0
  11. package/dist/NotificationServicesController/__fixtures__/index.cjs.map +1 -1
  12. package/dist/NotificationServicesController/__fixtures__/index.d.cts +1 -0
  13. package/dist/NotificationServicesController/__fixtures__/index.d.cts.map +1 -1
  14. package/dist/NotificationServicesController/__fixtures__/index.d.mts +1 -0
  15. package/dist/NotificationServicesController/__fixtures__/index.d.mts.map +1 -1
  16. package/dist/NotificationServicesController/__fixtures__/index.mjs +1 -0
  17. package/dist/NotificationServicesController/__fixtures__/index.mjs.map +1 -1
  18. package/dist/NotificationServicesController/__fixtures__/mock-snap-notification.cjs +29 -0
  19. package/dist/NotificationServicesController/__fixtures__/mock-snap-notification.cjs.map +1 -0
  20. package/dist/NotificationServicesController/__fixtures__/mock-snap-notification.d.cts +8 -0
  21. package/dist/NotificationServicesController/__fixtures__/mock-snap-notification.d.cts.map +1 -0
  22. package/dist/NotificationServicesController/__fixtures__/mock-snap-notification.d.mts +8 -0
  23. package/dist/NotificationServicesController/__fixtures__/mock-snap-notification.d.mts.map +1 -0
  24. package/dist/NotificationServicesController/__fixtures__/mock-snap-notification.mjs +25 -0
  25. package/dist/NotificationServicesController/__fixtures__/mock-snap-notification.mjs.map +1 -0
  26. package/dist/NotificationServicesController/constants/notification-schema.cjs +1 -0
  27. package/dist/NotificationServicesController/constants/notification-schema.cjs.map +1 -1
  28. package/dist/NotificationServicesController/constants/notification-schema.d.cts +2 -1
  29. package/dist/NotificationServicesController/constants/notification-schema.d.cts.map +1 -1
  30. package/dist/NotificationServicesController/constants/notification-schema.d.mts +2 -1
  31. package/dist/NotificationServicesController/constants/notification-schema.d.mts.map +1 -1
  32. package/dist/NotificationServicesController/constants/notification-schema.mjs +1 -0
  33. package/dist/NotificationServicesController/constants/notification-schema.mjs.map +1 -1
  34. package/dist/NotificationServicesController/processors/process-notifications.cjs +5 -0
  35. package/dist/NotificationServicesController/processors/process-notifications.cjs.map +1 -1
  36. package/dist/NotificationServicesController/processors/process-notifications.d.cts +3 -3
  37. package/dist/NotificationServicesController/processors/process-notifications.d.cts.map +1 -1
  38. package/dist/NotificationServicesController/processors/process-notifications.d.mts +3 -3
  39. package/dist/NotificationServicesController/processors/process-notifications.d.mts.map +1 -1
  40. package/dist/NotificationServicesController/processors/process-notifications.mjs +5 -0
  41. package/dist/NotificationServicesController/processors/process-notifications.mjs.map +1 -1
  42. package/dist/NotificationServicesController/processors/process-snap-notifications.cjs +23 -0
  43. package/dist/NotificationServicesController/processors/process-snap-notifications.cjs.map +1 -0
  44. package/dist/NotificationServicesController/processors/process-snap-notifications.d.cts +10 -0
  45. package/dist/NotificationServicesController/processors/process-snap-notifications.d.cts.map +1 -0
  46. package/dist/NotificationServicesController/processors/process-snap-notifications.d.mts +10 -0
  47. package/dist/NotificationServicesController/processors/process-snap-notifications.d.mts.map +1 -0
  48. package/dist/NotificationServicesController/processors/process-snap-notifications.mjs +19 -0
  49. package/dist/NotificationServicesController/processors/process-snap-notifications.mjs.map +1 -0
  50. package/dist/NotificationServicesController/types/notification/notification.cjs.map +1 -1
  51. package/dist/NotificationServicesController/types/notification/notification.d.cts +10 -6
  52. package/dist/NotificationServicesController/types/notification/notification.d.cts.map +1 -1
  53. package/dist/NotificationServicesController/types/notification/notification.d.mts +10 -6
  54. package/dist/NotificationServicesController/types/notification/notification.d.mts.map +1 -1
  55. package/dist/NotificationServicesController/types/notification/notification.mjs.map +1 -1
  56. package/dist/NotificationServicesController/types/snaps/index.cjs +18 -0
  57. package/dist/NotificationServicesController/types/snaps/index.cjs.map +1 -0
  58. package/dist/NotificationServicesController/types/snaps/index.d.cts +2 -0
  59. package/dist/NotificationServicesController/types/snaps/index.d.cts.map +1 -0
  60. package/dist/NotificationServicesController/types/snaps/index.d.mts +2 -0
  61. package/dist/NotificationServicesController/types/snaps/index.d.mts.map +1 -0
  62. package/dist/NotificationServicesController/types/snaps/index.mjs +2 -0
  63. package/dist/NotificationServicesController/types/snaps/index.mjs.map +1 -0
  64. package/dist/NotificationServicesController/types/snaps/snaps.cjs +3 -0
  65. package/dist/NotificationServicesController/types/snaps/snaps.cjs.map +1 -0
  66. package/dist/NotificationServicesController/types/snaps/snaps.d.cts +23 -0
  67. package/dist/NotificationServicesController/types/snaps/snaps.d.cts.map +1 -0
  68. package/dist/NotificationServicesController/types/snaps/snaps.d.mts +23 -0
  69. package/dist/NotificationServicesController/types/snaps/snaps.d.mts.map +1 -0
  70. package/dist/NotificationServicesController/types/snaps/snaps.mjs +2 -0
  71. package/dist/NotificationServicesController/types/snaps/snaps.mjs.map +1 -0
  72. package/dist/NotificationServicesPushController/NotificationServicesPushController.cjs +3 -1
  73. package/dist/NotificationServicesPushController/NotificationServicesPushController.cjs.map +1 -1
  74. package/dist/NotificationServicesPushController/NotificationServicesPushController.d.cts +2 -1
  75. package/dist/NotificationServicesPushController/NotificationServicesPushController.d.cts.map +1 -1
  76. package/dist/NotificationServicesPushController/NotificationServicesPushController.d.mts +2 -1
  77. package/dist/NotificationServicesPushController/NotificationServicesPushController.d.mts.map +1 -1
  78. package/dist/NotificationServicesPushController/NotificationServicesPushController.mjs +3 -1
  79. package/dist/NotificationServicesPushController/NotificationServicesPushController.mjs.map +1 -1
  80. package/dist/NotificationServicesPushController/services/services.cjs +2 -2
  81. package/dist/NotificationServicesPushController/services/services.cjs.map +1 -1
  82. package/dist/NotificationServicesPushController/services/services.d.cts +1 -0
  83. package/dist/NotificationServicesPushController/services/services.d.cts.map +1 -1
  84. package/dist/NotificationServicesPushController/services/services.d.mts +1 -0
  85. package/dist/NotificationServicesPushController/services/services.d.mts.map +1 -1
  86. package/dist/NotificationServicesPushController/services/services.mjs +2 -2
  87. package/dist/NotificationServicesPushController/services/services.mjs.map +1 -1
  88. package/package.json +3 -2
package/CHANGELOG.md CHANGED
@@ -7,6 +7,26 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
7
7
 
8
8
  ## [Unreleased]
9
9
 
10
+ ## [0.11.0]
11
+
12
+ ### Added
13
+
14
+ - Added support for an optional FCM token parameter for push notifications on mobile platforms, allowing native handling of FCM token creation through the Firebase SDK ([#4823](https://github.com/MetaMask/core/pull/4823))
15
+
16
+ ### Changed
17
+
18
+ - update the types described in `types/on-chain-notification/schema` and `types/on-chain-notification/on-chain-notification` ([#4818](https://github.com/MetaMask/core/pull/4818))
19
+
20
+ - adds new notifications: aave_v3_health_factor; ens_expiration; lido_staking_rewards; notional_loan_expiration; rocketpool_staking_rewards; spark_fi_health_factor
21
+ - splits Wallet Notifications from Web 3 Notifications
22
+
23
+ - updated and added new notification mocks ([#4818](https://github.com/MetaMask/core/pull/4818))
24
+ - can be accessed through `@metamask/notification-services-controller/notification-services/mocks`
25
+
26
+ ### Fixed
27
+
28
+ - made `updateMetamaskNotificationsList` function work correctly by making the message handler async and moving the publish call outside of the update function. This ensures the `NotificationServicesController:notificationsListUpdated` event is received by the extension ([#4826](https://github.com/MetaMask/core/pull/4826))
29
+
10
30
  ## [0.10.0]
11
31
 
12
32
  ### Added
@@ -200,7 +220,8 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
200
220
 
201
221
  - Initial release
202
222
 
203
- [Unreleased]: https://github.com/MetaMask/core/compare/@metamask/notification-services-controller@0.10.0...HEAD
223
+ [Unreleased]: https://github.com/MetaMask/core/compare/@metamask/notification-services-controller@0.11.0...HEAD
224
+ [0.11.0]: https://github.com/MetaMask/core/compare/@metamask/notification-services-controller@0.10.0...@metamask/notification-services-controller@0.11.0
204
225
  [0.10.0]: https://github.com/MetaMask/core/compare/@metamask/notification-services-controller@0.9.0...@metamask/notification-services-controller@0.10.0
205
226
  [0.9.0]: https://github.com/MetaMask/core/compare/@metamask/notification-services-controller@0.8.2...@metamask/notification-services-controller@0.9.0
206
227
  [0.8.2]: https://github.com/MetaMask/core/compare/@metamask/notification-services-controller@0.8.1...@metamask/notification-services-controller@0.8.2
@@ -41,6 +41,7 @@ Object.defineProperty(exports, "__esModule", { value: true });
41
41
  exports.defaultState = void 0;
42
42
  const base_controller_1 = require("@metamask/base-controller");
43
43
  const controller_utils_1 = require("@metamask/controller-utils");
44
+ const utils_1 = require("@metamask/utils");
44
45
  const loglevel_1 = __importDefault(require("loglevel"));
45
46
  const constants_1 = require("./constants/constants.cjs");
46
47
  const notification_schema_1 = require("./constants/notification-schema.cjs");
@@ -104,6 +105,9 @@ exports.defaultState = {
104
105
  isUpdatingMetamaskNotificationsAccount: [],
105
106
  isCheckingAccountsPresence: false,
106
107
  };
108
+ const locallyPersistedNotificationTypes = new Set([
109
+ notification_schema_1.TRIGGER_TYPES.SNAP,
110
+ ]);
107
111
  /**
108
112
  * Controller that enables wallet notifications and feature announcements
109
113
  */
@@ -632,9 +636,11 @@ class NotificationServicesController extends base_controller_1.BaseController {
632
636
  .filter(isNotUndefined);
633
637
  const featureAnnouncementNotifications = processAndFilter(rawFeatureAnnouncementNotifications);
634
638
  const onChainNotifications = processAndFilter(rawOnChainNotifications);
639
+ const snapNotifications = this.state.metamaskNotificationsList.filter((notification) => notification.type === notification_schema_1.TRIGGER_TYPES.SNAP);
635
640
  const metamaskNotifications = [
636
641
  ...featureAnnouncementNotifications,
637
642
  ...onChainNotifications,
643
+ ...snapNotifications,
638
644
  ];
639
645
  metamaskNotifications.sort((a, b) => new Date(b.createdAt).getTime() - new Date(a.createdAt).getTime());
640
646
  // Update State
@@ -651,6 +657,51 @@ class NotificationServicesController extends base_controller_1.BaseController {
651
657
  throw new Error('Failed to fetch notifications');
652
658
  }
653
659
  }
660
+ /**
661
+ * Gets the specified type of notifications from state.
662
+ *
663
+ * @param type - The trigger type.
664
+ * @returns An array of notifications of the passed in type.
665
+ * @throws Throws an error if an invalid trigger type is passed.
666
+ */
667
+ getNotificationsByType(type) {
668
+ (0, utils_1.assert)(Object.values(notification_schema_1.TRIGGER_TYPES).includes(type), 'Invalid trigger type.');
669
+ return this.state.metamaskNotificationsList.filter((notification) => notification.type === type);
670
+ }
671
+ /**
672
+ * Used to delete a notification by id.
673
+ *
674
+ * Note: This function should only be used for notifications that are stored
675
+ * in this controller directly, currently only snaps notifications.
676
+ *
677
+ * @param id - The id of the notification to delete.
678
+ */
679
+ async deleteNotificationById(id) {
680
+ const fetchedNotification = this.state.metamaskNotificationsList.find((notification) => notification.id === id);
681
+ (0, utils_1.assert)(fetchedNotification, 'The notification to be deleted does not exist.');
682
+ (0, utils_1.assert)(locallyPersistedNotificationTypes.has(fetchedNotification.type), `The notification type of "${
683
+ // notifications are guaranteed to have type properties which equate to strings
684
+ fetchedNotification.type}" is not locally persisted, only the following types can use this function: ${[
685
+ ...locallyPersistedNotificationTypes,
686
+ ].join(', ')}.`);
687
+ const newList = this.state.metamaskNotificationsList.filter((notification) => notification.id !== id);
688
+ this.update((state) => {
689
+ state.metamaskNotificationsList = newList;
690
+ });
691
+ }
692
+ /**
693
+ * Used to batch delete notifications by id.
694
+ *
695
+ * Note: This function should only be used for notifications that are stored
696
+ * in this controller directly, currently only snaps notifications.
697
+ *
698
+ * @param ids - The ids of the notifications to delete.
699
+ */
700
+ async deleteNotificationsById(ids) {
701
+ for (const id of ids) {
702
+ await this.deleteNotificationById(id);
703
+ }
704
+ }
654
705
  /**
655
706
  * Marks specified metamask notifications as read.
656
707
  *
@@ -660,12 +711,23 @@ class NotificationServicesController extends base_controller_1.BaseController {
660
711
  async markMetamaskNotificationsAsRead(notifications) {
661
712
  let onchainNotificationIds = [];
662
713
  let featureAnnouncementNotificationIds = [];
714
+ let snapNotificationIds = [];
663
715
  try {
664
- // Filter unread on/off chain notifications
665
- const onChainNotifications = notifications.filter((notification) => notification.type !== notification_schema_1.TRIGGER_TYPES.FEATURES_ANNOUNCEMENT &&
666
- !notification.isRead);
667
- const featureAnnouncementNotifications = notifications.filter((notification) => notification.type === notification_schema_1.TRIGGER_TYPES.FEATURES_ANNOUNCEMENT &&
668
- !notification.isRead);
716
+ const [onChainNotifications, featureAnnouncementNotifications, snapNotifications,] = notifications.reduce((allNotifications, notification) => {
717
+ if (!notification.isRead) {
718
+ switch (notification.type) {
719
+ case notification_schema_1.TRIGGER_TYPES.FEATURES_ANNOUNCEMENT:
720
+ allNotifications[1].push(notification);
721
+ break;
722
+ case notification_schema_1.TRIGGER_TYPES.SNAP:
723
+ allNotifications[2].push(notification);
724
+ break;
725
+ default:
726
+ allNotifications[0].push(notification);
727
+ }
728
+ }
729
+ return allNotifications;
730
+ }, [[], [], []]);
669
731
  // Mark On-Chain Notifications as Read
670
732
  if (onChainNotifications.length > 0) {
671
733
  const bearerToken = await __classPrivateFieldGet(this, _NotificationServicesController_auth, "f").getBearerToken();
@@ -682,6 +744,9 @@ class NotificationServicesController extends base_controller_1.BaseController {
682
744
  featureAnnouncementNotificationIds =
683
745
  featureAnnouncementNotifications.map((notification) => notification.id);
684
746
  }
747
+ if (snapNotifications.length > 0) {
748
+ snapNotificationIds = snapNotifications.map((notification) => notification.id);
749
+ }
685
750
  }
686
751
  catch (err) {
687
752
  loglevel_1.default.warn('Something failed when marking notifications as read', err);
@@ -689,13 +754,23 @@ class NotificationServicesController extends base_controller_1.BaseController {
689
754
  // Update the state (state is also used on counter & badge)
690
755
  this.update((state) => {
691
756
  const currentReadList = state.metamaskNotificationsReadList;
692
- const newReadIds = [...featureAnnouncementNotificationIds];
757
+ const newReadIds = [
758
+ ...featureAnnouncementNotificationIds,
759
+ ...snapNotificationIds,
760
+ ];
693
761
  state.metamaskNotificationsReadList = [
694
762
  ...new Set([...currentReadList, ...newReadIds]),
695
763
  ];
696
764
  state.metamaskNotificationsList = state.metamaskNotificationsList.map((notification) => {
697
765
  if (newReadIds.includes(notification.id) ||
698
766
  onchainNotificationIds.includes(notification.id)) {
767
+ if (notification.type === notification_schema_1.TRIGGER_TYPES.SNAP) {
768
+ return {
769
+ ...notification,
770
+ isRead: true,
771
+ readDate: new Date().toISOString(),
772
+ };
773
+ }
699
774
  return { ...notification, isRead: true };
700
775
  }
701
776
  return notification;
@@ -719,21 +794,23 @@ class NotificationServicesController extends base_controller_1.BaseController {
719
794
  this.update((state) => {
720
795
  const existingNotificationIds = new Set(state.metamaskNotificationsList.map((n) => n.id));
721
796
  // Add the new notification only if its ID is not already present in the list
722
- if (!existingNotificationIds.has(notification.id)) {
797
+ if (!existingNotificationIds.has(processedNotification.id)) {
723
798
  state.metamaskNotificationsList = [
724
- notification,
799
+ processedNotification,
725
800
  ...state.metamaskNotificationsList,
726
801
  ];
727
- this.messagingSystem.publish(`${controllerName}:notificationsListUpdated`, state.metamaskNotificationsList);
728
802
  }
729
803
  });
804
+ this.messagingSystem.publish(`${controllerName}:notificationsListUpdated`, this.state.metamaskNotificationsList);
730
805
  }
731
806
  }
732
807
  }
733
808
  _NotificationServicesController_isPushIntegrated = new WeakMap(), _NotificationServicesController_isPushNotificationsSetup = new WeakMap(), _NotificationServicesController_isUnlocked = new WeakMap(), _NotificationServicesController_keyringController = new WeakMap(), _NotificationServicesController_auth = new WeakMap(), _NotificationServicesController_storage = new WeakMap(), _NotificationServicesController_pushNotifications = new WeakMap(), _NotificationServicesController_accounts = new WeakMap(), _NotificationServicesController_featureAnnouncementEnv = new WeakMap(), _NotificationServicesController_performEnableProfileSyncing = new WeakMap(), _NotificationServicesController_instances = new WeakSet(), _NotificationServicesController_registerMessageHandlers = function _NotificationServicesController_registerMessageHandlers() {
734
- this.messagingSystem.registerActionHandler(`${controllerName}:updateMetamaskNotificationsList`, this.updateMetamaskNotificationsList.bind(this));
809
+ this.messagingSystem.registerActionHandler(`${controllerName}:updateMetamaskNotificationsList`, async (...args) => this.updateMetamaskNotificationsList(...args));
735
810
  this.messagingSystem.registerActionHandler(`${controllerName}:disableNotificationServices`, this.disableNotificationServices.bind(this));
736
811
  this.messagingSystem.registerActionHandler(`${controllerName}:selectIsNotificationServicesEnabled`, this.selectIsNotificationServicesEnabled.bind(this));
812
+ this.messagingSystem.registerActionHandler(`${controllerName}:getNotificationsByType`, this.getNotificationsByType.bind(this));
813
+ this.messagingSystem.registerActionHandler(`${controllerName}:deleteNotificationsById`, this.deleteNotificationsById.bind(this));
737
814
  }, _NotificationServicesController_clearLoadingStates = function _NotificationServicesController_clearLoadingStates() {
738
815
  this.update((state) => {
739
816
  state.isUpdatingMetamaskNotifications = false;
@@ -1 +1 @@
1
- {"version":3,"file":"NotificationServicesController.cjs","sourceRoot":"","sources":["../../src/NotificationServicesController/NotificationServicesController.ts"],"names":[],"mappings":"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","sourcesContent":["import type {\n RestrictedControllerMessenger,\n ControllerGetStateAction,\n ControllerStateChangeEvent,\n StateMetadata,\n} from '@metamask/base-controller';\nimport { BaseController } from '@metamask/base-controller';\nimport { toChecksumHexAddress } from '@metamask/controller-utils';\nimport type {\n KeyringControllerGetAccountsAction,\n KeyringControllerStateChangeEvent,\n KeyringControllerGetStateAction,\n KeyringControllerLockEvent,\n KeyringControllerUnlockEvent,\n} from '@metamask/keyring-controller';\nimport type {\n AuthenticationController,\n UserStorageController,\n} from '@metamask/profile-sync-controller';\nimport log from 'loglevel';\n\nimport { USER_STORAGE_VERSION_KEY } from './constants/constants';\nimport { TRIGGER_TYPES } from './constants/notification-schema';\nimport { safeProcessNotification } from './processors/process-notifications';\nimport * as FeatureNotifications from './services/feature-announcements';\nimport * as OnChainNotifications from './services/onchain-notifications';\nimport type {\n INotification,\n MarkAsReadNotificationsParam,\n NotificationUnion,\n} from './types/notification/notification';\nimport type { OnChainRawNotification } from './types/on-chain-notification/on-chain-notification';\nimport type { UserStorage } from './types/user-storage/user-storage';\nimport * as Utils from './utils/utils';\n\n// TODO: Fix Circular Type Dependencies\n// This indicates that control flow of messages is everywhere, lets orchestrate these better\nexport type NotificationServicesPushControllerEnablePushNotifications = {\n type: `NotificationServicesPushController:enablePushNotifications`;\n handler: (UUIDs: string[]) => Promise<void>;\n};\n\nexport type NotificationServicesPushControllerDisablePushNotifications = {\n type: `NotificationServicesPushController:disablePushNotifications`;\n handler: (UUIDs: string[]) => Promise<void>;\n};\n\nexport type NotificationServicesPushControllerUpdateTriggerPushNotifications = {\n type: `NotificationServicesPushController:updateTriggerPushNotifications`;\n handler: (UUIDs: string[]) => Promise<void>;\n};\n\nexport type NotificationServicesPushControllerSubscribeToNotifications = {\n type: `NotificationServicesPushController:subscribeToPushNotifications`;\n handler: () => Promise<void>;\n};\n\nexport type NotificationServicesPushControllerOnNewNotification = {\n type: `NotificationServicesPushController:onNewNotifications`;\n payload: [INotification];\n};\n\n// Unique name for the controller\nconst controllerName = 'NotificationServicesController';\n\n/**\n * State shape for NotificationServicesController\n */\nexport type NotificationServicesControllerState = {\n /**\n * We store and manage accounts that have been seen/visted through the\n * account subscription. This allows us to track and add notifications for new accounts and not previous accounts added.\n */\n subscriptionAccountsSeen: string[];\n\n /**\n * Flag that indicates if the metamask notifications feature has been seen\n */\n isMetamaskNotificationsFeatureSeen: boolean;\n\n /**\n * Flag that indicates if the metamask notifications are enabled\n */\n isNotificationServicesEnabled: boolean;\n\n /**\n * Flag that indicates if the feature announcements are enabled\n */\n isFeatureAnnouncementsEnabled: boolean;\n\n /**\n * List of metamask notifications\n */\n metamaskNotificationsList: INotification[];\n\n /**\n * List of read metamask notifications\n */\n metamaskNotificationsReadList: string[];\n /**\n * Flag that indicates that the creating notifications is in progress\n */\n isUpdatingMetamaskNotifications: boolean;\n /**\n * Flag that indicates that the fetching notifications is in progress\n * This is used to show a loading spinner in the UI\n * when fetching notifications\n */\n isFetchingMetamaskNotifications: boolean;\n /**\n * Flag that indicates that the updating notifications for a specific address is in progress\n */\n isUpdatingMetamaskNotificationsAccount: string[];\n /**\n * Flag that indicates that the checking accounts presence is in progress\n */\n isCheckingAccountsPresence: boolean;\n};\n\nconst metadata: StateMetadata<NotificationServicesControllerState> = {\n subscriptionAccountsSeen: {\n persist: true,\n anonymous: true,\n },\n\n isMetamaskNotificationsFeatureSeen: {\n persist: true,\n anonymous: false,\n },\n isNotificationServicesEnabled: {\n persist: true,\n anonymous: false,\n },\n isFeatureAnnouncementsEnabled: {\n persist: true,\n anonymous: false,\n },\n metamaskNotificationsList: {\n persist: true,\n anonymous: true,\n },\n metamaskNotificationsReadList: {\n persist: true,\n anonymous: true,\n },\n isUpdatingMetamaskNotifications: {\n persist: false,\n anonymous: false,\n },\n isFetchingMetamaskNotifications: {\n persist: false,\n anonymous: false,\n },\n isUpdatingMetamaskNotificationsAccount: {\n persist: false,\n anonymous: false,\n },\n isCheckingAccountsPresence: {\n persist: false,\n anonymous: false,\n },\n};\nexport const defaultState: NotificationServicesControllerState = {\n subscriptionAccountsSeen: [],\n isMetamaskNotificationsFeatureSeen: false,\n isNotificationServicesEnabled: false,\n isFeatureAnnouncementsEnabled: false,\n metamaskNotificationsList: [],\n metamaskNotificationsReadList: [],\n isUpdatingMetamaskNotifications: false,\n isFetchingMetamaskNotifications: false,\n isUpdatingMetamaskNotificationsAccount: [],\n isCheckingAccountsPresence: false,\n};\n\nexport type NotificationServicesControllerGetStateAction =\n ControllerGetStateAction<\n typeof controllerName,\n NotificationServicesControllerState\n >;\n\nexport type NotificationServicesControllerUpdateMetamaskNotificationsList = {\n type: `${typeof controllerName}:updateMetamaskNotificationsList`;\n handler: NotificationServicesController['updateMetamaskNotificationsList'];\n};\n\nexport type NotificationServicesControllerDisableNotificationServices = {\n type: `${typeof controllerName}:disableNotificationServices`;\n handler: NotificationServicesController['disableNotificationServices'];\n};\n\nexport type NotificationServicesControllerSelectIsNotificationServicesEnabled =\n {\n type: `${typeof controllerName}:selectIsNotificationServicesEnabled`;\n handler: NotificationServicesController['selectIsNotificationServicesEnabled'];\n };\n\n// Messenger Actions\nexport type Actions =\n | NotificationServicesControllerGetStateAction\n | NotificationServicesControllerUpdateMetamaskNotificationsList\n | NotificationServicesControllerDisableNotificationServices\n | NotificationServicesControllerSelectIsNotificationServicesEnabled;\n\n// Allowed Actions\nexport type AllowedActions =\n // Keyring Controller Requests\n | KeyringControllerGetAccountsAction\n | KeyringControllerGetStateAction\n // Auth Controller Requests\n | AuthenticationController.AuthenticationControllerGetBearerToken\n | AuthenticationController.AuthenticationControllerIsSignedIn\n // User Storage Controller Requests\n | UserStorageController.UserStorageControllerEnableProfileSyncing\n | UserStorageController.UserStorageControllerGetStorageKey\n | UserStorageController.UserStorageControllerPerformGetStorage\n | UserStorageController.UserStorageControllerPerformSetStorage\n // Push Notifications Controller Requests\n | NotificationServicesPushControllerEnablePushNotifications\n | NotificationServicesPushControllerDisablePushNotifications\n | NotificationServicesPushControllerUpdateTriggerPushNotifications\n | NotificationServicesPushControllerSubscribeToNotifications;\n\n// Events\nexport type NotificationServicesControllerStateChangeEvent =\n ControllerStateChangeEvent<\n typeof controllerName,\n NotificationServicesControllerState\n >;\n\nexport type NotificationListUpdatedEvent = {\n type: `${typeof controllerName}:notificationsListUpdated`;\n payload: [INotification[]];\n};\n\nexport type MarkNotificationsAsReadEvent = {\n type: `${typeof controllerName}:markNotificationsAsRead`;\n payload: [INotification[]];\n};\n\n// Events\nexport type Events =\n | NotificationServicesControllerStateChangeEvent\n | NotificationListUpdatedEvent\n | MarkNotificationsAsReadEvent;\n\n// Allowed Events\nexport type AllowedEvents =\n // Keyring Events\n | KeyringControllerStateChangeEvent\n | KeyringControllerLockEvent\n | KeyringControllerUnlockEvent\n // Push Notification Events\n | NotificationServicesPushControllerOnNewNotification;\n\n// Type for the messenger of NotificationServicesController\nexport type NotificationServicesControllerMessenger =\n RestrictedControllerMessenger<\n typeof controllerName,\n Actions | AllowedActions,\n Events | AllowedEvents,\n AllowedActions['type'],\n AllowedEvents['type']\n >;\n\ntype FeatureAnnouncementEnv = {\n spaceId: string;\n accessToken: string;\n platform: 'extension' | 'mobile';\n};\n\n/**\n * Controller that enables wallet notifications and feature announcements\n */\nexport default class NotificationServicesController extends BaseController<\n typeof controllerName,\n NotificationServicesControllerState,\n NotificationServicesControllerMessenger\n> {\n // Temporary boolean as push notifications are not yet enabled on mobile\n #isPushIntegrated = true;\n\n // Flag to check is notifications have been setup when the browser/extension is initialized.\n // We want to re-initialize push notifications when the browser/extension is refreshed\n // To ensure we subscribe to the most up-to-date notifications\n #isPushNotificationsSetup = false;\n\n #isUnlocked = false;\n\n #keyringController = {\n setupLockedStateSubscriptions: (onUnlock: () => Promise<void>) => {\n const { isUnlocked } = this.messagingSystem.call(\n 'KeyringController:getState',\n );\n this.#isUnlocked = isUnlocked;\n\n this.messagingSystem.subscribe('KeyringController:unlock', () => {\n this.#isUnlocked = true;\n // messaging system cannot await promises\n // we don't need to wait for a result on this.\n // eslint-disable-next-line @typescript-eslint/no-floating-promises\n onUnlock();\n });\n\n this.messagingSystem.subscribe('KeyringController:lock', () => {\n this.#isUnlocked = false;\n });\n },\n };\n\n #auth = {\n getBearerToken: async () => {\n return await this.messagingSystem.call(\n 'AuthenticationController:getBearerToken',\n );\n },\n isSignedIn: () => {\n return this.messagingSystem.call('AuthenticationController:isSignedIn');\n },\n };\n\n #storage = {\n enableProfileSyncing: async () => {\n return await this.messagingSystem.call(\n 'UserStorageController:enableProfileSyncing',\n );\n },\n getStorageKey: () => {\n return this.messagingSystem.call('UserStorageController:getStorageKey');\n },\n getNotificationStorage: async () => {\n return await this.messagingSystem.call(\n 'UserStorageController:performGetStorage',\n 'notifications.notification_settings',\n );\n },\n setNotificationStorage: async (state: string) => {\n return await this.messagingSystem.call(\n 'UserStorageController:performSetStorage',\n 'notifications.notification_settings',\n state,\n );\n },\n };\n\n #pushNotifications = {\n subscribeToPushNotifications: async () => {\n await this.messagingSystem.call(\n 'NotificationServicesPushController:subscribeToPushNotifications',\n );\n },\n enablePushNotifications: async (UUIDs: string[]) => {\n if (!this.#isPushIntegrated) {\n return;\n }\n try {\n await this.messagingSystem.call(\n 'NotificationServicesPushController:enablePushNotifications',\n UUIDs,\n );\n } catch (e) {\n log.error('Silently failed to enable push notifications', e);\n }\n },\n disablePushNotifications: async (UUIDs: string[]) => {\n if (!this.#isPushIntegrated) {\n return;\n }\n try {\n await this.messagingSystem.call(\n 'NotificationServicesPushController:disablePushNotifications',\n UUIDs,\n );\n } catch (e) {\n log.error('Silently failed to disable push notifications', e);\n }\n },\n updatePushNotifications: async (UUIDs: string[]) => {\n if (!this.#isPushIntegrated) {\n return;\n }\n try {\n await this.messagingSystem.call(\n 'NotificationServicesPushController:updateTriggerPushNotifications',\n UUIDs,\n );\n } catch (e) {\n log.error('Silently failed to update push notifications', e);\n }\n },\n subscribe: () => {\n if (!this.#isPushIntegrated) {\n return;\n }\n this.messagingSystem.subscribe(\n 'NotificationServicesPushController:onNewNotifications',\n (notification) => {\n // eslint-disable-next-line @typescript-eslint/no-floating-promises\n this.updateMetamaskNotificationsList(notification);\n },\n );\n },\n initializePushNotifications: async () => {\n if (!this.#isPushIntegrated) {\n return;\n }\n if (!this.state.isNotificationServicesEnabled) {\n return;\n }\n if (this.#isPushNotificationsSetup) {\n return;\n }\n\n // If wallet is unlocked, we can create a fresh push subscription\n // Otherwise we can subscribe to original subscription\n if (this.#isUnlocked) {\n const storage = await this.#getUserStorage();\n if (!storage) {\n return;\n }\n\n const uuids = Utils.getAllUUIDs(storage);\n await this.#pushNotifications.enablePushNotifications(uuids);\n this.#isPushNotificationsSetup = true;\n } else {\n await this.#pushNotifications.subscribeToPushNotifications();\n }\n },\n };\n\n #accounts = {\n /**\n * Used to get list of addresses from keyring (wallet addresses)\n *\n * @returns addresses removed, added, and latest list of addresses\n */\n listAccounts: async () => {\n // Get previous and current account sets\n const nonChecksumAccounts = await this.messagingSystem.call(\n 'KeyringController:getAccounts',\n );\n const accounts = nonChecksumAccounts.map((a) => toChecksumHexAddress(a));\n const currentAccountsSet = new Set(accounts);\n const prevAccountsSet = new Set(this.state.subscriptionAccountsSeen);\n\n // Invalid value you cannot have zero accounts\n // Only occurs when the Accounts controller is initializing.\n if (accounts.length === 0) {\n return {\n accountsAdded: [],\n accountsRemoved: [],\n accounts: [],\n };\n }\n\n // Calculate added and removed addresses\n const accountsAdded = accounts.filter((a) => !prevAccountsSet.has(a));\n const accountsRemoved = [...prevAccountsSet.values()].filter(\n (a) => !currentAccountsSet.has(a),\n );\n\n // Update accounts seen\n this.update((state) => {\n state.subscriptionAccountsSeen = [...prevAccountsSet, ...accountsAdded];\n });\n\n return {\n accountsAdded,\n accountsRemoved,\n accounts,\n };\n },\n\n /**\n * Initializes the cache/previous list. This is handy so we have an accurate in-mem state of the previous list of accounts.\n *\n * @returns result from list accounts\n */\n initialize: () => {\n return this.#accounts.listAccounts();\n },\n\n /**\n * Subscription to any state change in the keyring controller (aka wallet accounts).\n * We can call the `listAccounts` defined above to find out about any accounts added, removed\n * And call effects to subscribe/unsubscribe to notifications.\n */\n subscribe: () => {\n this.messagingSystem.subscribe(\n 'KeyringController:stateChange',\n // eslint-disable-next-line @typescript-eslint/no-misused-promises\n async () => {\n if (!this.state.isNotificationServicesEnabled) {\n return;\n }\n\n const { accountsAdded, accountsRemoved } =\n await this.#accounts.listAccounts();\n\n const promises: Promise<unknown>[] = [];\n if (accountsAdded.length > 0) {\n promises.push(this.updateOnChainTriggersByAccount(accountsAdded));\n }\n if (accountsRemoved.length > 0) {\n promises.push(this.deleteOnChainTriggersByAccount(accountsRemoved));\n }\n await Promise.all(promises);\n },\n );\n },\n };\n\n #featureAnnouncementEnv: FeatureAnnouncementEnv;\n\n /**\n * Creates a NotificationServicesController instance.\n *\n * @param args - The arguments to this function.\n * @param args.messenger - Messenger used to communicate with BaseV2 controller.\n * @param args.state - Initial state to set on this controller.\n * @param args.env - environment variables for a given controller.\n * @param args.env.featureAnnouncements - env variables for feature announcements.\n * @param args.env.isPushIntegrated - toggle push notifications on/off if client has integrated them.\n */\n constructor({\n messenger,\n state,\n env,\n }: {\n messenger: NotificationServicesControllerMessenger;\n state?: Partial<NotificationServicesControllerState>;\n env: {\n featureAnnouncements: FeatureAnnouncementEnv;\n isPushIntegrated?: boolean;\n };\n }) {\n super({\n messenger,\n metadata,\n name: controllerName,\n state: { ...defaultState, ...state },\n });\n\n this.#isPushIntegrated = env.isPushIntegrated ?? true;\n this.#featureAnnouncementEnv = env.featureAnnouncements;\n this.#registerMessageHandlers();\n this.#clearLoadingStates();\n\n this.#keyringController.setupLockedStateSubscriptions(\n this.#pushNotifications.initializePushNotifications,\n );\n // eslint-disable-next-line @typescript-eslint/no-floating-promises\n this.#accounts.initialize();\n // eslint-disable-next-line @typescript-eslint/no-floating-promises\n this.#pushNotifications.initializePushNotifications();\n this.#accounts.subscribe();\n this.#pushNotifications.subscribe();\n }\n\n #registerMessageHandlers(): void {\n this.messagingSystem.registerActionHandler(\n `${controllerName}:updateMetamaskNotificationsList`,\n this.updateMetamaskNotificationsList.bind(this),\n );\n\n this.messagingSystem.registerActionHandler(\n `${controllerName}:disableNotificationServices`,\n this.disableNotificationServices.bind(this),\n );\n\n this.messagingSystem.registerActionHandler(\n `${controllerName}:selectIsNotificationServicesEnabled`,\n this.selectIsNotificationServicesEnabled.bind(this),\n );\n }\n\n #clearLoadingStates(): void {\n this.update((state) => {\n state.isUpdatingMetamaskNotifications = false;\n state.isCheckingAccountsPresence = false;\n state.isFetchingMetamaskNotifications = false;\n state.isUpdatingMetamaskNotificationsAccount = [];\n });\n }\n\n #assertAuthEnabled() {\n if (!this.#auth.isSignedIn()) {\n this.update((state) => {\n state.isNotificationServicesEnabled = false;\n });\n throw new Error('User is not signed in.');\n }\n }\n\n async #getValidStorageKeyAndBearerToken() {\n this.#assertAuthEnabled();\n\n const bearerToken = await this.#auth.getBearerToken();\n const storageKey = await this.#storage.getStorageKey();\n\n if (!bearerToken || !storageKey) {\n throw new Error('Missing BearerToken or storage key');\n }\n\n return { bearerToken, storageKey };\n }\n\n #performEnableProfileSyncing = async () => {\n try {\n await this.#storage.enableProfileSyncing();\n } catch (e) {\n log.error('Failed to enable profile syncing', e);\n throw new Error('Failed to enable profile syncing');\n }\n };\n\n #assertUserStorage(\n storage: UserStorage | null,\n ): asserts storage is UserStorage {\n if (!storage) {\n throw new Error('User Storage does not exist');\n }\n }\n\n /**\n * Retrieves and parses the user storage from the storage key.\n *\n * This method attempts to retrieve the user storage using the specified storage key,\n * then parses the JSON string to an object. If the storage is not found or cannot be parsed,\n * it throws an error.\n *\n * @returns The parsed user storage object or null\n */\n async #getUserStorage(): Promise<UserStorage | null> {\n const userStorageString: string | null =\n await this.#storage.getNotificationStorage();\n\n if (!userStorageString) {\n return null;\n }\n\n try {\n const userStorage: UserStorage = JSON.parse(userStorageString);\n return userStorage;\n } catch (error) {\n log.error('Unable to parse User Storage');\n return null;\n }\n }\n\n /**\n * Retrieves the current enabled state of MetaMask notifications.\n *\n * This method directly returns the boolean value of `isMetamaskNotificationsEnabled`\n * from the controller's state, indicating whether MetaMask notifications are currently enabled.\n *\n * @returns The enabled state of MetaMask notifications.\n */\n public selectIsNotificationServicesEnabled(): boolean {\n return this.state.isNotificationServicesEnabled;\n }\n\n /**\n * Sets the state of notification creation process.\n *\n * This method updates the `isUpdatingMetamaskNotifications` state, which can be used to indicate\n * whether the notification creation process is currently active or not. This is useful\n * for UI elements that need to reflect the state of ongoing operations, such as loading\n * indicators or disabled buttons during processing.\n *\n * @param isUpdatingMetamaskNotifications - A boolean value representing the new state of the notification creation process.\n */\n #setIsUpdatingMetamaskNotifications(\n isUpdatingMetamaskNotifications: boolean,\n ) {\n this.update((state) => {\n state.isUpdatingMetamaskNotifications = isUpdatingMetamaskNotifications;\n });\n }\n\n /**\n * Updates the state to indicate whether fetching of MetaMask notifications is in progress.\n *\n * This method is used to set the `isFetchingMetamaskNotifications` state, which can be utilized\n * to show or hide loading indicators in the UI when notifications are being fetched.\n *\n * @param isFetchingMetamaskNotifications - A boolean value representing the fetching state.\n */\n #setIsFetchingMetamaskNotifications(\n isFetchingMetamaskNotifications: boolean,\n ) {\n this.update((state) => {\n state.isFetchingMetamaskNotifications = isFetchingMetamaskNotifications;\n });\n }\n\n /**\n * Updates the state to indicate that the checking of accounts presence is in progress.\n *\n * This method modifies the `isCheckingAccountsPresence` state, which can be used to manage UI elements\n * that depend on the status of account presence checks, such as displaying loading indicators or disabling\n * buttons while the check is ongoing.\n *\n * @param isCheckingAccountsPresence - A boolean value indicating whether the account presence check is currently active.\n */\n #setIsCheckingAccountsPresence(isCheckingAccountsPresence: boolean) {\n this.update((state) => {\n state.isCheckingAccountsPresence = isCheckingAccountsPresence;\n });\n }\n\n /**\n * Updates the state to indicate that account updates are in progress.\n * Removes duplicate accounts before updating the state.\n *\n * @param accounts - The accounts being updated.\n */\n #updateUpdatingAccountsState(accounts: string[]) {\n this.update((state) => {\n const uniqueAccounts = new Set([\n ...state.isUpdatingMetamaskNotificationsAccount,\n ...accounts,\n ]);\n state.isUpdatingMetamaskNotificationsAccount = Array.from(uniqueAccounts);\n });\n }\n\n /**\n * Clears the state indicating that account updates are complete.\n *\n * @param accounts - The accounts that have finished updating.\n */\n #clearUpdatingAccountsState(accounts: string[]) {\n this.update((state) => {\n state.isUpdatingMetamaskNotificationsAccount =\n state.isUpdatingMetamaskNotificationsAccount.filter(\n (existingAccount) => !accounts.includes(existingAccount),\n );\n });\n }\n\n public async checkAccountsPresence(\n accounts: string[],\n ): Promise<Record<string, boolean>> {\n try {\n this.#setIsCheckingAccountsPresence(true);\n\n // Retrieve user storage\n const userStorage = await this.#getUserStorage();\n this.#assertUserStorage(userStorage);\n\n const presence = Utils.checkAccountsPresence(userStorage, accounts);\n return presence;\n } catch (error) {\n log.error('Failed to check accounts presence', error);\n throw error;\n } finally {\n this.#setIsCheckingAccountsPresence(false);\n }\n }\n\n /**\n * Sets the enabled state of feature announcements.\n *\n * **Action** - used in the notification settings to enable/disable feature announcements.\n *\n * @param featureAnnouncementsEnabled - A boolean value indicating the desired enabled state of the feature announcements.\n * @async\n * @throws {Error} If fails to update\n */\n public async setFeatureAnnouncementsEnabled(\n featureAnnouncementsEnabled: boolean,\n ) {\n try {\n this.update((s) => {\n s.isFeatureAnnouncementsEnabled = featureAnnouncementsEnabled;\n });\n } catch (e) {\n log.error('Unable to toggle feature announcements', e);\n throw new Error('Unable to toggle feature announcements');\n }\n }\n\n /**\n * This creates/re-creates on-chain triggers defined in User Storage.\n *\n * **Action** - Used during Sign In / Enabling of notifications.\n *\n * @param opts - optional options to mutate this functionality\n * @param opts.resetNotifications - this will not use the users stored preferences, and instead re-create notification triggers\n * It will help in case uses get into a corrupted state or wants to wipe their notifications.\n * @returns The updated or newly created user storage.\n * @throws {Error} Throws an error if unauthenticated or from other operations.\n */\n public async createOnChainTriggers(opts?: {\n resetNotifications?: boolean;\n }): Promise<UserStorage> {\n try {\n this.#setIsUpdatingMetamaskNotifications(true);\n\n await this.#performEnableProfileSyncing();\n\n const { bearerToken, storageKey } =\n await this.#getValidStorageKeyAndBearerToken();\n\n const { accounts } = await this.#accounts.listAccounts();\n\n // Attempt Get User Storage\n // Will be null if entry does not exist, or a user is resetting their notifications\n // Will be defined if entry exists\n // Will throw if fails to get the user storage entry\n let userStorage = opts?.resetNotifications\n ? null\n : await this.#getUserStorage();\n\n // If userStorage does not exist, create a new one\n // All the triggers created are set as: \"disabled\"\n if (userStorage?.[USER_STORAGE_VERSION_KEY] === undefined) {\n userStorage = Utils.initializeUserStorage(\n accounts.map((account) => ({ address: account })),\n false,\n );\n\n // Write the userStorage\n await this.#storage.setNotificationStorage(JSON.stringify(userStorage));\n }\n\n // Create the triggers\n const triggers = Utils.traverseUserStorageTriggers(userStorage);\n await OnChainNotifications.createOnChainTriggers(\n userStorage,\n storageKey,\n bearerToken,\n triggers,\n );\n\n // Create push notifications triggers\n const allUUIDS = Utils.getAllUUIDs(userStorage);\n await this.#pushNotifications.enablePushNotifications(allUUIDS);\n\n // Write the new userStorage (triggers are now \"enabled\")\n await this.#storage.setNotificationStorage(JSON.stringify(userStorage));\n\n // Update the state of the controller\n this.update((state) => {\n state.isNotificationServicesEnabled = true;\n state.isFeatureAnnouncementsEnabled = true;\n state.isMetamaskNotificationsFeatureSeen = true;\n });\n\n return userStorage;\n } catch (err) {\n log.error('Failed to create On Chain triggers', err);\n throw new Error('Failed to create On Chain triggers');\n } finally {\n this.#setIsUpdatingMetamaskNotifications(false);\n }\n }\n\n /**\n * Enables all MetaMask notifications for the user.\n * This is identical flow when initializing notifications for the first time.\n * 1. Enable Profile Syncing\n * 2. Get or Create Notification User Storage\n * 3. Upsert Triggers\n * 4. Update Push notifications\n *\n * @throws {Error} If there is an error during the process of enabling notifications.\n */\n public async enableMetamaskNotifications() {\n try {\n this.#setIsUpdatingMetamaskNotifications(true);\n await this.createOnChainTriggers();\n } catch (e) {\n log.error('Unable to enable notifications', e);\n throw new Error('Unable to enable notifications');\n } finally {\n this.#setIsUpdatingMetamaskNotifications(false);\n }\n }\n\n /**\n * Disables all MetaMask notifications for the user.\n * This method ensures that the user is authenticated, retrieves all linked accounts,\n * and disables on-chain triggers for each account. It also sets the global notification\n * settings for MetaMask, feature announcements to false.\n *\n * @throws {Error} If the user is not authenticated or if there is an error during the process.\n */\n public async disableNotificationServices() {\n try {\n this.#setIsUpdatingMetamaskNotifications(true);\n\n // Disable Push Notifications\n const userStorage = await this.#getUserStorage();\n this.#assertUserStorage(userStorage);\n const UUIDs = Utils.getAllUUIDs(userStorage);\n await this.#pushNotifications.disablePushNotifications(UUIDs);\n\n // Clear Notification States (toggles and list)\n this.update((state) => {\n state.isNotificationServicesEnabled = false;\n state.isFeatureAnnouncementsEnabled = false;\n state.metamaskNotificationsList = [];\n });\n } catch (e) {\n log.error('Unable to disable notifications', e);\n throw new Error('Unable to disable notifications');\n } finally {\n this.#setIsUpdatingMetamaskNotifications(false);\n }\n }\n\n /**\n * Deletes on-chain triggers associated with a specific account.\n * This method performs several key operations:\n * 1. Validates Auth & Storage\n * 2. Finds and deletes all triggers associated with the account\n * 3. Disables any related push notifications\n * 4. Updates Storage to reflect new state.\n *\n * **Action** - When a user disables notifications for a given account in settings.\n *\n * @param accounts - The account for which on-chain triggers are to be deleted.\n * @returns A promise that resolves to void or an object containing a success message.\n * @throws {Error} Throws an error if unauthenticated or from other operations.\n */\n public async deleteOnChainTriggersByAccount(\n accounts: string[],\n ): Promise<UserStorage> {\n try {\n this.#updateUpdatingAccountsState(accounts);\n // Get and Validate BearerToken and User Storage Key\n const { bearerToken, storageKey } =\n await this.#getValidStorageKeyAndBearerToken();\n\n // Get & Validate User Storage\n const userStorage = await this.#getUserStorage();\n this.#assertUserStorage(userStorage);\n\n // Get the UUIDs to delete\n const UUIDs = accounts\n .map((a) => Utils.getUUIDsForAccount(userStorage, a.toLowerCase()))\n .flat();\n\n if (UUIDs.length === 0) {\n return userStorage;\n }\n\n // Delete these UUIDs (Mutates User Storage)\n await OnChainNotifications.deleteOnChainTriggers(\n userStorage,\n storageKey,\n bearerToken,\n UUIDs,\n );\n\n // Delete these UUIDs from the push notifications\n await this.#pushNotifications.disablePushNotifications(UUIDs);\n\n // Update User Storage\n await this.#storage.setNotificationStorage(JSON.stringify(userStorage));\n return userStorage;\n } catch (err) {\n log.error('Failed to delete OnChain triggers', err);\n throw new Error('Failed to delete OnChain triggers');\n } finally {\n this.#clearUpdatingAccountsState(accounts);\n }\n }\n\n /**\n * Updates/Creates on-chain triggers for a specific account.\n *\n * This method performs several key operations:\n * 1. Validates Auth & Storage\n * 2. Finds and creates any missing triggers associated with the account\n * 3. Enables any related push notifications\n * 4. Updates Storage to reflect new state.\n *\n * **Action** - When a user enables notifications for an account\n *\n * @param accounts - List of accounts you want to update.\n * @returns A promise that resolves to the updated user storage.\n * @throws {Error} Throws an error if unauthenticated or from other operations.\n */\n public async updateOnChainTriggersByAccount(\n accounts: string[],\n ): Promise<UserStorage> {\n try {\n this.#updateUpdatingAccountsState(accounts);\n // Get and Validate BearerToken and User Storage Key\n const { bearerToken, storageKey } =\n await this.#getValidStorageKeyAndBearerToken();\n\n // Get & Validate User Storage\n const userStorage = await this.#getUserStorage();\n this.#assertUserStorage(userStorage);\n\n // Add any missing triggers\n accounts.forEach((a) => Utils.upsertAddressTriggers(a, userStorage));\n\n const newTriggers = Utils.traverseUserStorageTriggers(userStorage, {\n mapTrigger: (t) => {\n if (!t.enabled) {\n return t;\n }\n return undefined;\n },\n });\n\n // Create any missing triggers.\n if (newTriggers.length > 0) {\n // Write te updated userStorage (where triggers are disabled)\n await this.#storage.setNotificationStorage(JSON.stringify(userStorage));\n\n // Create the triggers\n const triggers = Utils.traverseUserStorageTriggers(userStorage, {\n mapTrigger: (t) => {\n if (\n accounts.some((a) => a.toLowerCase() === t.address.toLowerCase())\n ) {\n return t;\n }\n return undefined;\n },\n });\n await OnChainNotifications.createOnChainTriggers(\n userStorage,\n storageKey,\n bearerToken,\n triggers,\n );\n }\n\n // Update Push Notifications Triggers\n const UUIDs = Utils.getAllUUIDs(userStorage);\n await this.#pushNotifications.updatePushNotifications(UUIDs);\n\n // Update the userStorage (where triggers are enabled)\n await this.#storage.setNotificationStorage(JSON.stringify(userStorage));\n return userStorage;\n } catch (err) {\n log.error('Failed to update OnChain triggers', err);\n throw new Error('Failed to update OnChain triggers');\n } finally {\n this.#clearUpdatingAccountsState(accounts);\n }\n }\n\n /**\n * Fetches the list of metamask notifications.\n * This includes OnChain notifications and Feature Announcements.\n *\n * **Action** - When a user views the notification list page/dropdown\n *\n * @param previewToken - the preview token to use if needed\n * @throws {Error} Throws an error if unauthenticated or from other operations.\n */\n public async fetchAndUpdateMetamaskNotifications(\n previewToken?: string,\n ): Promise<INotification[]> {\n try {\n this.#setIsFetchingMetamaskNotifications(true);\n\n // Raw Feature Notifications\n const rawFeatureAnnouncementNotifications = this.state\n .isFeatureAnnouncementsEnabled\n ? await FeatureNotifications.getFeatureAnnouncementNotifications(\n this.#featureAnnouncementEnv,\n previewToken,\n ).catch(() => [])\n : [];\n\n // Raw On Chain Notifications\n const rawOnChainNotifications: OnChainRawNotification[] = [];\n const userStorage = await this.#storage\n .getNotificationStorage()\n .then((s) => s && (JSON.parse(s) as UserStorage))\n .catch(() => null);\n const bearerToken = await this.#auth.getBearerToken().catch(() => null);\n if (userStorage && bearerToken) {\n const notifications =\n await OnChainNotifications.getOnChainNotifications(\n userStorage,\n bearerToken,\n ).catch(() => []);\n\n rawOnChainNotifications.push(...notifications);\n }\n\n const readIds = this.state.metamaskNotificationsReadList;\n\n // Combined Notifications\n const isNotUndefined = <Item>(t?: Item): t is Item => Boolean(t);\n const processAndFilter = (ns: NotificationUnion[]) =>\n ns\n .map((n) => safeProcessNotification(n, readIds))\n .filter(isNotUndefined);\n\n const featureAnnouncementNotifications = processAndFilter(\n rawFeatureAnnouncementNotifications,\n );\n const onChainNotifications = processAndFilter(rawOnChainNotifications);\n\n const metamaskNotifications: INotification[] = [\n ...featureAnnouncementNotifications,\n ...onChainNotifications,\n ];\n metamaskNotifications.sort(\n (a, b) =>\n new Date(b.createdAt).getTime() - new Date(a.createdAt).getTime(),\n );\n\n // Update State\n this.update((state) => {\n state.metamaskNotificationsList = metamaskNotifications;\n });\n\n this.messagingSystem.publish(\n `${controllerName}:notificationsListUpdated`,\n this.state.metamaskNotificationsList,\n );\n\n this.#setIsFetchingMetamaskNotifications(false);\n return metamaskNotifications;\n } catch (err) {\n this.#setIsFetchingMetamaskNotifications(false);\n log.error('Failed to fetch notifications', err);\n throw new Error('Failed to fetch notifications');\n }\n }\n\n /**\n * Marks specified metamask notifications as read.\n *\n * @param notifications - An array of notifications to be marked as read. Each notification should include its type and read status.\n * @returns A promise that resolves when the operation is complete.\n */\n public async markMetamaskNotificationsAsRead(\n notifications: MarkAsReadNotificationsParam,\n ): Promise<void> {\n let onchainNotificationIds: string[] = [];\n let featureAnnouncementNotificationIds: string[] = [];\n\n try {\n // Filter unread on/off chain notifications\n const onChainNotifications = notifications.filter(\n (notification) =>\n notification.type !== TRIGGER_TYPES.FEATURES_ANNOUNCEMENT &&\n !notification.isRead,\n );\n\n const featureAnnouncementNotifications = notifications.filter(\n (notification) =>\n notification.type === TRIGGER_TYPES.FEATURES_ANNOUNCEMENT &&\n !notification.isRead,\n );\n\n // Mark On-Chain Notifications as Read\n if (onChainNotifications.length > 0) {\n const bearerToken = await this.#auth.getBearerToken();\n\n if (bearerToken) {\n onchainNotificationIds = onChainNotifications.map(\n (notification) => notification.id,\n );\n await OnChainNotifications.markNotificationsAsRead(\n bearerToken,\n onchainNotificationIds,\n ).catch(() => {\n onchainNotificationIds = [];\n log.warn('Unable to mark onchain notifications as read');\n });\n }\n }\n\n // Mark Off-Chain notifications as Read\n if (featureAnnouncementNotifications.length > 0) {\n featureAnnouncementNotificationIds =\n featureAnnouncementNotifications.map(\n (notification) => notification.id,\n );\n }\n } catch (err) {\n log.warn('Something failed when marking notifications as read', err);\n }\n\n // Update the state (state is also used on counter & badge)\n this.update((state) => {\n const currentReadList = state.metamaskNotificationsReadList;\n const newReadIds = [...featureAnnouncementNotificationIds];\n state.metamaskNotificationsReadList = [\n ...new Set([...currentReadList, ...newReadIds]),\n ];\n\n state.metamaskNotificationsList = state.metamaskNotificationsList.map(\n (notification: INotification) => {\n if (\n newReadIds.includes(notification.id) ||\n onchainNotificationIds.includes(notification.id)\n ) {\n return { ...notification, isRead: true };\n }\n return notification;\n },\n );\n });\n\n this.messagingSystem.publish(\n `${controllerName}:markNotificationsAsRead`,\n this.state.metamaskNotificationsList,\n );\n }\n\n /**\n * Updates the list of MetaMask notifications by adding a new notification at the beginning of the list.\n * This method ensures that the most recent notification is displayed first in the UI.\n *\n * @param notification - The new notification object to be added to the list.\n * @returns A promise that resolves when the notification list has been successfully updated.\n */\n public async updateMetamaskNotificationsList(\n notification: INotification,\n ): Promise<void> {\n if (\n this.state.metamaskNotificationsList.some((n) => n.id === notification.id)\n ) {\n return;\n }\n\n const processedNotification = safeProcessNotification(notification);\n\n if (processedNotification) {\n this.update((state) => {\n const existingNotificationIds = new Set(\n state.metamaskNotificationsList.map((n) => n.id),\n );\n // Add the new notification only if its ID is not already present in the list\n if (!existingNotificationIds.has(notification.id)) {\n state.metamaskNotificationsList = [\n notification,\n ...state.metamaskNotificationsList,\n ];\n this.messagingSystem.publish(\n `${controllerName}:notificationsListUpdated`,\n state.metamaskNotificationsList,\n );\n }\n });\n }\n }\n}\n"]}
1
+ {"version":3,"file":"NotificationServicesController.cjs","sourceRoot":"","sources":["../../src/NotificationServicesController/NotificationServicesController.ts"],"names":[],"mappings":"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","sourcesContent":["import type {\n RestrictedControllerMessenger,\n ControllerGetStateAction,\n ControllerStateChangeEvent,\n StateMetadata,\n} from '@metamask/base-controller';\nimport { BaseController } from '@metamask/base-controller';\nimport { toChecksumHexAddress } from '@metamask/controller-utils';\nimport type {\n KeyringControllerGetAccountsAction,\n KeyringControllerStateChangeEvent,\n KeyringControllerGetStateAction,\n KeyringControllerLockEvent,\n KeyringControllerUnlockEvent,\n} from '@metamask/keyring-controller';\nimport type {\n AuthenticationController,\n UserStorageController,\n} from '@metamask/profile-sync-controller';\nimport { assert } from '@metamask/utils';\nimport log from 'loglevel';\n\nimport { USER_STORAGE_VERSION_KEY } from './constants/constants';\nimport { TRIGGER_TYPES } from './constants/notification-schema';\nimport { safeProcessNotification } from './processors/process-notifications';\nimport * as FeatureNotifications from './services/feature-announcements';\nimport * as OnChainNotifications from './services/onchain-notifications';\nimport type {\n INotification,\n MarkAsReadNotificationsParam,\n RawNotificationUnion,\n} from './types/notification/notification';\nimport type { OnChainRawNotification } from './types/on-chain-notification/on-chain-notification';\nimport type { UserStorage } from './types/user-storage/user-storage';\nimport * as Utils from './utils/utils';\n\n// TODO: Fix Circular Type Dependencies\n// This indicates that control flow of messages is everywhere, lets orchestrate these better\nexport type NotificationServicesPushControllerEnablePushNotifications = {\n type: `NotificationServicesPushController:enablePushNotifications`;\n handler: (UUIDs: string[]) => Promise<void>;\n};\n\nexport type NotificationServicesPushControllerDisablePushNotifications = {\n type: `NotificationServicesPushController:disablePushNotifications`;\n handler: (UUIDs: string[]) => Promise<void>;\n};\n\nexport type NotificationServicesPushControllerUpdateTriggerPushNotifications = {\n type: `NotificationServicesPushController:updateTriggerPushNotifications`;\n handler: (UUIDs: string[]) => Promise<void>;\n};\n\nexport type NotificationServicesPushControllerSubscribeToNotifications = {\n type: `NotificationServicesPushController:subscribeToPushNotifications`;\n handler: () => Promise<void>;\n};\n\nexport type NotificationServicesPushControllerOnNewNotification = {\n type: `NotificationServicesPushController:onNewNotifications`;\n payload: [INotification];\n};\n\n// Unique name for the controller\nconst controllerName = 'NotificationServicesController';\n\n/**\n * State shape for NotificationServicesController\n */\nexport type NotificationServicesControllerState = {\n /**\n * We store and manage accounts that have been seen/visted through the\n * account subscription. This allows us to track and add notifications for new accounts and not previous accounts added.\n */\n subscriptionAccountsSeen: string[];\n\n /**\n * Flag that indicates if the metamask notifications feature has been seen\n */\n isMetamaskNotificationsFeatureSeen: boolean;\n\n /**\n * Flag that indicates if the metamask notifications are enabled\n */\n isNotificationServicesEnabled: boolean;\n\n /**\n * Flag that indicates if the feature announcements are enabled\n */\n isFeatureAnnouncementsEnabled: boolean;\n\n /**\n * List of metamask notifications\n */\n metamaskNotificationsList: INotification[];\n\n /**\n * List of read metamask notifications\n */\n metamaskNotificationsReadList: string[];\n /**\n * Flag that indicates that the creating notifications is in progress\n */\n isUpdatingMetamaskNotifications: boolean;\n /**\n * Flag that indicates that the fetching notifications is in progress\n * This is used to show a loading spinner in the UI\n * when fetching notifications\n */\n isFetchingMetamaskNotifications: boolean;\n /**\n * Flag that indicates that the updating notifications for a specific address is in progress\n */\n isUpdatingMetamaskNotificationsAccount: string[];\n /**\n * Flag that indicates that the checking accounts presence is in progress\n */\n isCheckingAccountsPresence: boolean;\n};\n\nconst metadata: StateMetadata<NotificationServicesControllerState> = {\n subscriptionAccountsSeen: {\n persist: true,\n anonymous: true,\n },\n\n isMetamaskNotificationsFeatureSeen: {\n persist: true,\n anonymous: false,\n },\n isNotificationServicesEnabled: {\n persist: true,\n anonymous: false,\n },\n isFeatureAnnouncementsEnabled: {\n persist: true,\n anonymous: false,\n },\n metamaskNotificationsList: {\n persist: true,\n anonymous: true,\n },\n metamaskNotificationsReadList: {\n persist: true,\n anonymous: true,\n },\n isUpdatingMetamaskNotifications: {\n persist: false,\n anonymous: false,\n },\n isFetchingMetamaskNotifications: {\n persist: false,\n anonymous: false,\n },\n isUpdatingMetamaskNotificationsAccount: {\n persist: false,\n anonymous: false,\n },\n isCheckingAccountsPresence: {\n persist: false,\n anonymous: false,\n },\n};\nexport const defaultState: NotificationServicesControllerState = {\n subscriptionAccountsSeen: [],\n isMetamaskNotificationsFeatureSeen: false,\n isNotificationServicesEnabled: false,\n isFeatureAnnouncementsEnabled: false,\n metamaskNotificationsList: [],\n metamaskNotificationsReadList: [],\n isUpdatingMetamaskNotifications: false,\n isFetchingMetamaskNotifications: false,\n isUpdatingMetamaskNotificationsAccount: [],\n isCheckingAccountsPresence: false,\n};\n\nconst locallyPersistedNotificationTypes = new Set<TRIGGER_TYPES>([\n TRIGGER_TYPES.SNAP,\n]);\n\nexport type NotificationServicesControllerGetStateAction =\n ControllerGetStateAction<\n typeof controllerName,\n NotificationServicesControllerState\n >;\n\nexport type NotificationServicesControllerUpdateMetamaskNotificationsList = {\n type: `${typeof controllerName}:updateMetamaskNotificationsList`;\n handler: NotificationServicesController['updateMetamaskNotificationsList'];\n};\n\nexport type NotificationServicesControllerDisableNotificationServices = {\n type: `${typeof controllerName}:disableNotificationServices`;\n handler: NotificationServicesController['disableNotificationServices'];\n};\n\nexport type NotificationServicesControllerSelectIsNotificationServicesEnabled =\n {\n type: `${typeof controllerName}:selectIsNotificationServicesEnabled`;\n handler: NotificationServicesController['selectIsNotificationServicesEnabled'];\n };\n\nexport type NotificationServicesControllerGetNotificationsByType = {\n type: `${typeof controllerName}:getNotificationsByType`;\n handler: NotificationServicesController['getNotificationsByType'];\n};\n\nexport type NotificationServicesControllerDeleteNotificationsById = {\n type: `${typeof controllerName}:deleteNotificationsById`;\n handler: NotificationServicesController['deleteNotificationsById'];\n};\n\n// Messenger Actions\nexport type Actions =\n | NotificationServicesControllerGetStateAction\n | NotificationServicesControllerUpdateMetamaskNotificationsList\n | NotificationServicesControllerDisableNotificationServices\n | NotificationServicesControllerSelectIsNotificationServicesEnabled\n | NotificationServicesControllerGetNotificationsByType\n | NotificationServicesControllerDeleteNotificationsById;\n\n// Allowed Actions\nexport type AllowedActions =\n // Keyring Controller Requests\n | KeyringControllerGetAccountsAction\n | KeyringControllerGetStateAction\n // Auth Controller Requests\n | AuthenticationController.AuthenticationControllerGetBearerToken\n | AuthenticationController.AuthenticationControllerIsSignedIn\n // User Storage Controller Requests\n | UserStorageController.UserStorageControllerEnableProfileSyncing\n | UserStorageController.UserStorageControllerGetStorageKey\n | UserStorageController.UserStorageControllerPerformGetStorage\n | UserStorageController.UserStorageControllerPerformSetStorage\n // Push Notifications Controller Requests\n | NotificationServicesPushControllerEnablePushNotifications\n | NotificationServicesPushControllerDisablePushNotifications\n | NotificationServicesPushControllerUpdateTriggerPushNotifications\n | NotificationServicesPushControllerSubscribeToNotifications;\n\n// Events\nexport type NotificationServicesControllerStateChangeEvent =\n ControllerStateChangeEvent<\n typeof controllerName,\n NotificationServicesControllerState\n >;\n\nexport type NotificationListUpdatedEvent = {\n type: `${typeof controllerName}:notificationsListUpdated`;\n payload: [INotification[]];\n};\n\nexport type MarkNotificationsAsReadEvent = {\n type: `${typeof controllerName}:markNotificationsAsRead`;\n payload: [INotification[]];\n};\n\n// Events\nexport type Events =\n | NotificationServicesControllerStateChangeEvent\n | NotificationListUpdatedEvent\n | MarkNotificationsAsReadEvent;\n\n// Allowed Events\nexport type AllowedEvents =\n // Keyring Events\n | KeyringControllerStateChangeEvent\n | KeyringControllerLockEvent\n | KeyringControllerUnlockEvent\n // Push Notification Events\n | NotificationServicesPushControllerOnNewNotification;\n\n// Type for the messenger of NotificationServicesController\nexport type NotificationServicesControllerMessenger =\n RestrictedControllerMessenger<\n typeof controllerName,\n Actions | AllowedActions,\n Events | AllowedEvents,\n AllowedActions['type'],\n AllowedEvents['type']\n >;\n\ntype FeatureAnnouncementEnv = {\n spaceId: string;\n accessToken: string;\n platform: 'extension' | 'mobile';\n};\n\n/**\n * Controller that enables wallet notifications and feature announcements\n */\nexport default class NotificationServicesController extends BaseController<\n typeof controllerName,\n NotificationServicesControllerState,\n NotificationServicesControllerMessenger\n> {\n // Temporary boolean as push notifications are not yet enabled on mobile\n #isPushIntegrated = true;\n\n // Flag to check is notifications have been setup when the browser/extension is initialized.\n // We want to re-initialize push notifications when the browser/extension is refreshed\n // To ensure we subscribe to the most up-to-date notifications\n #isPushNotificationsSetup = false;\n\n #isUnlocked = false;\n\n #keyringController = {\n setupLockedStateSubscriptions: (onUnlock: () => Promise<void>) => {\n const { isUnlocked } = this.messagingSystem.call(\n 'KeyringController:getState',\n );\n this.#isUnlocked = isUnlocked;\n\n this.messagingSystem.subscribe('KeyringController:unlock', () => {\n this.#isUnlocked = true;\n // messaging system cannot await promises\n // we don't need to wait for a result on this.\n // eslint-disable-next-line @typescript-eslint/no-floating-promises\n onUnlock();\n });\n\n this.messagingSystem.subscribe('KeyringController:lock', () => {\n this.#isUnlocked = false;\n });\n },\n };\n\n #auth = {\n getBearerToken: async () => {\n return await this.messagingSystem.call(\n 'AuthenticationController:getBearerToken',\n );\n },\n isSignedIn: () => {\n return this.messagingSystem.call('AuthenticationController:isSignedIn');\n },\n };\n\n #storage = {\n enableProfileSyncing: async () => {\n return await this.messagingSystem.call(\n 'UserStorageController:enableProfileSyncing',\n );\n },\n getStorageKey: () => {\n return this.messagingSystem.call('UserStorageController:getStorageKey');\n },\n getNotificationStorage: async () => {\n return await this.messagingSystem.call(\n 'UserStorageController:performGetStorage',\n 'notifications.notification_settings',\n );\n },\n setNotificationStorage: async (state: string) => {\n return await this.messagingSystem.call(\n 'UserStorageController:performSetStorage',\n 'notifications.notification_settings',\n state,\n );\n },\n };\n\n #pushNotifications = {\n subscribeToPushNotifications: async () => {\n await this.messagingSystem.call(\n 'NotificationServicesPushController:subscribeToPushNotifications',\n );\n },\n enablePushNotifications: async (UUIDs: string[]) => {\n if (!this.#isPushIntegrated) {\n return;\n }\n try {\n await this.messagingSystem.call(\n 'NotificationServicesPushController:enablePushNotifications',\n UUIDs,\n );\n } catch (e) {\n log.error('Silently failed to enable push notifications', e);\n }\n },\n disablePushNotifications: async (UUIDs: string[]) => {\n if (!this.#isPushIntegrated) {\n return;\n }\n try {\n await this.messagingSystem.call(\n 'NotificationServicesPushController:disablePushNotifications',\n UUIDs,\n );\n } catch (e) {\n log.error('Silently failed to disable push notifications', e);\n }\n },\n updatePushNotifications: async (UUIDs: string[]) => {\n if (!this.#isPushIntegrated) {\n return;\n }\n try {\n await this.messagingSystem.call(\n 'NotificationServicesPushController:updateTriggerPushNotifications',\n UUIDs,\n );\n } catch (e) {\n log.error('Silently failed to update push notifications', e);\n }\n },\n subscribe: () => {\n if (!this.#isPushIntegrated) {\n return;\n }\n this.messagingSystem.subscribe(\n 'NotificationServicesPushController:onNewNotifications',\n (notification) => {\n // eslint-disable-next-line @typescript-eslint/no-floating-promises\n this.updateMetamaskNotificationsList(notification);\n },\n );\n },\n initializePushNotifications: async () => {\n if (!this.#isPushIntegrated) {\n return;\n }\n if (!this.state.isNotificationServicesEnabled) {\n return;\n }\n if (this.#isPushNotificationsSetup) {\n return;\n }\n\n // If wallet is unlocked, we can create a fresh push subscription\n // Otherwise we can subscribe to original subscription\n if (this.#isUnlocked) {\n const storage = await this.#getUserStorage();\n if (!storage) {\n return;\n }\n\n const uuids = Utils.getAllUUIDs(storage);\n await this.#pushNotifications.enablePushNotifications(uuids);\n this.#isPushNotificationsSetup = true;\n } else {\n await this.#pushNotifications.subscribeToPushNotifications();\n }\n },\n };\n\n #accounts = {\n /**\n * Used to get list of addresses from keyring (wallet addresses)\n *\n * @returns addresses removed, added, and latest list of addresses\n */\n listAccounts: async () => {\n // Get previous and current account sets\n const nonChecksumAccounts = await this.messagingSystem.call(\n 'KeyringController:getAccounts',\n );\n const accounts = nonChecksumAccounts.map((a) => toChecksumHexAddress(a));\n const currentAccountsSet = new Set(accounts);\n const prevAccountsSet = new Set(this.state.subscriptionAccountsSeen);\n\n // Invalid value you cannot have zero accounts\n // Only occurs when the Accounts controller is initializing.\n if (accounts.length === 0) {\n return {\n accountsAdded: [],\n accountsRemoved: [],\n accounts: [],\n };\n }\n\n // Calculate added and removed addresses\n const accountsAdded = accounts.filter((a) => !prevAccountsSet.has(a));\n const accountsRemoved = [...prevAccountsSet.values()].filter(\n (a) => !currentAccountsSet.has(a),\n );\n\n // Update accounts seen\n this.update((state) => {\n state.subscriptionAccountsSeen = [...prevAccountsSet, ...accountsAdded];\n });\n\n return {\n accountsAdded,\n accountsRemoved,\n accounts,\n };\n },\n\n /**\n * Initializes the cache/previous list. This is handy so we have an accurate in-mem state of the previous list of accounts.\n *\n * @returns result from list accounts\n */\n initialize: () => {\n return this.#accounts.listAccounts();\n },\n\n /**\n * Subscription to any state change in the keyring controller (aka wallet accounts).\n * We can call the `listAccounts` defined above to find out about any accounts added, removed\n * And call effects to subscribe/unsubscribe to notifications.\n */\n subscribe: () => {\n this.messagingSystem.subscribe(\n 'KeyringController:stateChange',\n // eslint-disable-next-line @typescript-eslint/no-misused-promises\n async () => {\n if (!this.state.isNotificationServicesEnabled) {\n return;\n }\n\n const { accountsAdded, accountsRemoved } =\n await this.#accounts.listAccounts();\n\n const promises: Promise<unknown>[] = [];\n if (accountsAdded.length > 0) {\n promises.push(this.updateOnChainTriggersByAccount(accountsAdded));\n }\n if (accountsRemoved.length > 0) {\n promises.push(this.deleteOnChainTriggersByAccount(accountsRemoved));\n }\n await Promise.all(promises);\n },\n );\n },\n };\n\n #featureAnnouncementEnv: FeatureAnnouncementEnv;\n\n /**\n * Creates a NotificationServicesController instance.\n *\n * @param args - The arguments to this function.\n * @param args.messenger - Messenger used to communicate with BaseV2 controller.\n * @param args.state - Initial state to set on this controller.\n * @param args.env - environment variables for a given controller.\n * @param args.env.featureAnnouncements - env variables for feature announcements.\n * @param args.env.isPushIntegrated - toggle push notifications on/off if client has integrated them.\n */\n constructor({\n messenger,\n state,\n env,\n }: {\n messenger: NotificationServicesControllerMessenger;\n state?: Partial<NotificationServicesControllerState>;\n env: {\n featureAnnouncements: FeatureAnnouncementEnv;\n isPushIntegrated?: boolean;\n };\n }) {\n super({\n messenger,\n metadata,\n name: controllerName,\n state: { ...defaultState, ...state },\n });\n\n this.#isPushIntegrated = env.isPushIntegrated ?? true;\n this.#featureAnnouncementEnv = env.featureAnnouncements;\n this.#registerMessageHandlers();\n this.#clearLoadingStates();\n\n this.#keyringController.setupLockedStateSubscriptions(\n this.#pushNotifications.initializePushNotifications,\n );\n // eslint-disable-next-line @typescript-eslint/no-floating-promises\n this.#accounts.initialize();\n // eslint-disable-next-line @typescript-eslint/no-floating-promises\n this.#pushNotifications.initializePushNotifications();\n this.#accounts.subscribe();\n this.#pushNotifications.subscribe();\n }\n\n #registerMessageHandlers(): void {\n this.messagingSystem.registerActionHandler(\n `${controllerName}:updateMetamaskNotificationsList`,\n async (...args) => this.updateMetamaskNotificationsList(...args),\n );\n\n this.messagingSystem.registerActionHandler(\n `${controllerName}:disableNotificationServices`,\n this.disableNotificationServices.bind(this),\n );\n\n this.messagingSystem.registerActionHandler(\n `${controllerName}:selectIsNotificationServicesEnabled`,\n this.selectIsNotificationServicesEnabled.bind(this),\n );\n\n this.messagingSystem.registerActionHandler(\n `${controllerName}:getNotificationsByType`,\n this.getNotificationsByType.bind(this),\n );\n\n this.messagingSystem.registerActionHandler(\n `${controllerName}:deleteNotificationsById`,\n this.deleteNotificationsById.bind(this),\n );\n }\n\n #clearLoadingStates(): void {\n this.update((state) => {\n state.isUpdatingMetamaskNotifications = false;\n state.isCheckingAccountsPresence = false;\n state.isFetchingMetamaskNotifications = false;\n state.isUpdatingMetamaskNotificationsAccount = [];\n });\n }\n\n #assertAuthEnabled() {\n if (!this.#auth.isSignedIn()) {\n this.update((state) => {\n state.isNotificationServicesEnabled = false;\n });\n throw new Error('User is not signed in.');\n }\n }\n\n async #getValidStorageKeyAndBearerToken() {\n this.#assertAuthEnabled();\n\n const bearerToken = await this.#auth.getBearerToken();\n const storageKey = await this.#storage.getStorageKey();\n\n if (!bearerToken || !storageKey) {\n throw new Error('Missing BearerToken or storage key');\n }\n\n return { bearerToken, storageKey };\n }\n\n #performEnableProfileSyncing = async () => {\n try {\n await this.#storage.enableProfileSyncing();\n } catch (e) {\n log.error('Failed to enable profile syncing', e);\n throw new Error('Failed to enable profile syncing');\n }\n };\n\n #assertUserStorage(\n storage: UserStorage | null,\n ): asserts storage is UserStorage {\n if (!storage) {\n throw new Error('User Storage does not exist');\n }\n }\n\n /**\n * Retrieves and parses the user storage from the storage key.\n *\n * This method attempts to retrieve the user storage using the specified storage key,\n * then parses the JSON string to an object. If the storage is not found or cannot be parsed,\n * it throws an error.\n *\n * @returns The parsed user storage object or null\n */\n async #getUserStorage(): Promise<UserStorage | null> {\n const userStorageString: string | null =\n await this.#storage.getNotificationStorage();\n\n if (!userStorageString) {\n return null;\n }\n\n try {\n const userStorage: UserStorage = JSON.parse(userStorageString);\n return userStorage;\n } catch (error) {\n log.error('Unable to parse User Storage');\n return null;\n }\n }\n\n /**\n * Retrieves the current enabled state of MetaMask notifications.\n *\n * This method directly returns the boolean value of `isMetamaskNotificationsEnabled`\n * from the controller's state, indicating whether MetaMask notifications are currently enabled.\n *\n * @returns The enabled state of MetaMask notifications.\n */\n public selectIsNotificationServicesEnabled(): boolean {\n return this.state.isNotificationServicesEnabled;\n }\n\n /**\n * Sets the state of notification creation process.\n *\n * This method updates the `isUpdatingMetamaskNotifications` state, which can be used to indicate\n * whether the notification creation process is currently active or not. This is useful\n * for UI elements that need to reflect the state of ongoing operations, such as loading\n * indicators or disabled buttons during processing.\n *\n * @param isUpdatingMetamaskNotifications - A boolean value representing the new state of the notification creation process.\n */\n #setIsUpdatingMetamaskNotifications(\n isUpdatingMetamaskNotifications: boolean,\n ) {\n this.update((state) => {\n state.isUpdatingMetamaskNotifications = isUpdatingMetamaskNotifications;\n });\n }\n\n /**\n * Updates the state to indicate whether fetching of MetaMask notifications is in progress.\n *\n * This method is used to set the `isFetchingMetamaskNotifications` state, which can be utilized\n * to show or hide loading indicators in the UI when notifications are being fetched.\n *\n * @param isFetchingMetamaskNotifications - A boolean value representing the fetching state.\n */\n #setIsFetchingMetamaskNotifications(\n isFetchingMetamaskNotifications: boolean,\n ) {\n this.update((state) => {\n state.isFetchingMetamaskNotifications = isFetchingMetamaskNotifications;\n });\n }\n\n /**\n * Updates the state to indicate that the checking of accounts presence is in progress.\n *\n * This method modifies the `isCheckingAccountsPresence` state, which can be used to manage UI elements\n * that depend on the status of account presence checks, such as displaying loading indicators or disabling\n * buttons while the check is ongoing.\n *\n * @param isCheckingAccountsPresence - A boolean value indicating whether the account presence check is currently active.\n */\n #setIsCheckingAccountsPresence(isCheckingAccountsPresence: boolean) {\n this.update((state) => {\n state.isCheckingAccountsPresence = isCheckingAccountsPresence;\n });\n }\n\n /**\n * Updates the state to indicate that account updates are in progress.\n * Removes duplicate accounts before updating the state.\n *\n * @param accounts - The accounts being updated.\n */\n #updateUpdatingAccountsState(accounts: string[]) {\n this.update((state) => {\n const uniqueAccounts = new Set([\n ...state.isUpdatingMetamaskNotificationsAccount,\n ...accounts,\n ]);\n state.isUpdatingMetamaskNotificationsAccount = Array.from(uniqueAccounts);\n });\n }\n\n /**\n * Clears the state indicating that account updates are complete.\n *\n * @param accounts - The accounts that have finished updating.\n */\n #clearUpdatingAccountsState(accounts: string[]) {\n this.update((state) => {\n state.isUpdatingMetamaskNotificationsAccount =\n state.isUpdatingMetamaskNotificationsAccount.filter(\n (existingAccount) => !accounts.includes(existingAccount),\n );\n });\n }\n\n public async checkAccountsPresence(\n accounts: string[],\n ): Promise<Record<string, boolean>> {\n try {\n this.#setIsCheckingAccountsPresence(true);\n\n // Retrieve user storage\n const userStorage = await this.#getUserStorage();\n this.#assertUserStorage(userStorage);\n\n const presence = Utils.checkAccountsPresence(userStorage, accounts);\n return presence;\n } catch (error) {\n log.error('Failed to check accounts presence', error);\n throw error;\n } finally {\n this.#setIsCheckingAccountsPresence(false);\n }\n }\n\n /**\n * Sets the enabled state of feature announcements.\n *\n * **Action** - used in the notification settings to enable/disable feature announcements.\n *\n * @param featureAnnouncementsEnabled - A boolean value indicating the desired enabled state of the feature announcements.\n * @async\n * @throws {Error} If fails to update\n */\n public async setFeatureAnnouncementsEnabled(\n featureAnnouncementsEnabled: boolean,\n ) {\n try {\n this.update((s) => {\n s.isFeatureAnnouncementsEnabled = featureAnnouncementsEnabled;\n });\n } catch (e) {\n log.error('Unable to toggle feature announcements', e);\n throw new Error('Unable to toggle feature announcements');\n }\n }\n\n /**\n * This creates/re-creates on-chain triggers defined in User Storage.\n *\n * **Action** - Used during Sign In / Enabling of notifications.\n *\n * @param opts - optional options to mutate this functionality\n * @param opts.resetNotifications - this will not use the users stored preferences, and instead re-create notification triggers\n * It will help in case uses get into a corrupted state or wants to wipe their notifications.\n * @returns The updated or newly created user storage.\n * @throws {Error} Throws an error if unauthenticated or from other operations.\n */\n public async createOnChainTriggers(opts?: {\n resetNotifications?: boolean;\n }): Promise<UserStorage> {\n try {\n this.#setIsUpdatingMetamaskNotifications(true);\n\n await this.#performEnableProfileSyncing();\n\n const { bearerToken, storageKey } =\n await this.#getValidStorageKeyAndBearerToken();\n\n const { accounts } = await this.#accounts.listAccounts();\n\n // Attempt Get User Storage\n // Will be null if entry does not exist, or a user is resetting their notifications\n // Will be defined if entry exists\n // Will throw if fails to get the user storage entry\n let userStorage = opts?.resetNotifications\n ? null\n : await this.#getUserStorage();\n\n // If userStorage does not exist, create a new one\n // All the triggers created are set as: \"disabled\"\n if (userStorage?.[USER_STORAGE_VERSION_KEY] === undefined) {\n userStorage = Utils.initializeUserStorage(\n accounts.map((account) => ({ address: account })),\n false,\n );\n\n // Write the userStorage\n await this.#storage.setNotificationStorage(JSON.stringify(userStorage));\n }\n\n // Create the triggers\n const triggers = Utils.traverseUserStorageTriggers(userStorage);\n await OnChainNotifications.createOnChainTriggers(\n userStorage,\n storageKey,\n bearerToken,\n triggers,\n );\n\n // Create push notifications triggers\n const allUUIDS = Utils.getAllUUIDs(userStorage);\n await this.#pushNotifications.enablePushNotifications(allUUIDS);\n\n // Write the new userStorage (triggers are now \"enabled\")\n await this.#storage.setNotificationStorage(JSON.stringify(userStorage));\n\n // Update the state of the controller\n this.update((state) => {\n state.isNotificationServicesEnabled = true;\n state.isFeatureAnnouncementsEnabled = true;\n state.isMetamaskNotificationsFeatureSeen = true;\n });\n\n return userStorage;\n } catch (err) {\n log.error('Failed to create On Chain triggers', err);\n throw new Error('Failed to create On Chain triggers');\n } finally {\n this.#setIsUpdatingMetamaskNotifications(false);\n }\n }\n\n /**\n * Enables all MetaMask notifications for the user.\n * This is identical flow when initializing notifications for the first time.\n * 1. Enable Profile Syncing\n * 2. Get or Create Notification User Storage\n * 3. Upsert Triggers\n * 4. Update Push notifications\n *\n * @throws {Error} If there is an error during the process of enabling notifications.\n */\n public async enableMetamaskNotifications() {\n try {\n this.#setIsUpdatingMetamaskNotifications(true);\n await this.createOnChainTriggers();\n } catch (e) {\n log.error('Unable to enable notifications', e);\n throw new Error('Unable to enable notifications');\n } finally {\n this.#setIsUpdatingMetamaskNotifications(false);\n }\n }\n\n /**\n * Disables all MetaMask notifications for the user.\n * This method ensures that the user is authenticated, retrieves all linked accounts,\n * and disables on-chain triggers for each account. It also sets the global notification\n * settings for MetaMask, feature announcements to false.\n *\n * @throws {Error} If the user is not authenticated or if there is an error during the process.\n */\n public async disableNotificationServices() {\n try {\n this.#setIsUpdatingMetamaskNotifications(true);\n\n // Disable Push Notifications\n const userStorage = await this.#getUserStorage();\n this.#assertUserStorage(userStorage);\n const UUIDs = Utils.getAllUUIDs(userStorage);\n await this.#pushNotifications.disablePushNotifications(UUIDs);\n\n // Clear Notification States (toggles and list)\n this.update((state) => {\n state.isNotificationServicesEnabled = false;\n state.isFeatureAnnouncementsEnabled = false;\n state.metamaskNotificationsList = [];\n });\n } catch (e) {\n log.error('Unable to disable notifications', e);\n throw new Error('Unable to disable notifications');\n } finally {\n this.#setIsUpdatingMetamaskNotifications(false);\n }\n }\n\n /**\n * Deletes on-chain triggers associated with a specific account.\n * This method performs several key operations:\n * 1. Validates Auth & Storage\n * 2. Finds and deletes all triggers associated with the account\n * 3. Disables any related push notifications\n * 4. Updates Storage to reflect new state.\n *\n * **Action** - When a user disables notifications for a given account in settings.\n *\n * @param accounts - The account for which on-chain triggers are to be deleted.\n * @returns A promise that resolves to void or an object containing a success message.\n * @throws {Error} Throws an error if unauthenticated or from other operations.\n */\n public async deleteOnChainTriggersByAccount(\n accounts: string[],\n ): Promise<UserStorage> {\n try {\n this.#updateUpdatingAccountsState(accounts);\n // Get and Validate BearerToken and User Storage Key\n const { bearerToken, storageKey } =\n await this.#getValidStorageKeyAndBearerToken();\n\n // Get & Validate User Storage\n const userStorage = await this.#getUserStorage();\n this.#assertUserStorage(userStorage);\n\n // Get the UUIDs to delete\n const UUIDs = accounts\n .map((a) => Utils.getUUIDsForAccount(userStorage, a.toLowerCase()))\n .flat();\n\n if (UUIDs.length === 0) {\n return userStorage;\n }\n\n // Delete these UUIDs (Mutates User Storage)\n await OnChainNotifications.deleteOnChainTriggers(\n userStorage,\n storageKey,\n bearerToken,\n UUIDs,\n );\n\n // Delete these UUIDs from the push notifications\n await this.#pushNotifications.disablePushNotifications(UUIDs);\n\n // Update User Storage\n await this.#storage.setNotificationStorage(JSON.stringify(userStorage));\n return userStorage;\n } catch (err) {\n log.error('Failed to delete OnChain triggers', err);\n throw new Error('Failed to delete OnChain triggers');\n } finally {\n this.#clearUpdatingAccountsState(accounts);\n }\n }\n\n /**\n * Updates/Creates on-chain triggers for a specific account.\n *\n * This method performs several key operations:\n * 1. Validates Auth & Storage\n * 2. Finds and creates any missing triggers associated with the account\n * 3. Enables any related push notifications\n * 4. Updates Storage to reflect new state.\n *\n * **Action** - When a user enables notifications for an account\n *\n * @param accounts - List of accounts you want to update.\n * @returns A promise that resolves to the updated user storage.\n * @throws {Error} Throws an error if unauthenticated or from other operations.\n */\n public async updateOnChainTriggersByAccount(\n accounts: string[],\n ): Promise<UserStorage> {\n try {\n this.#updateUpdatingAccountsState(accounts);\n // Get and Validate BearerToken and User Storage Key\n const { bearerToken, storageKey } =\n await this.#getValidStorageKeyAndBearerToken();\n\n // Get & Validate User Storage\n const userStorage = await this.#getUserStorage();\n this.#assertUserStorage(userStorage);\n\n // Add any missing triggers\n accounts.forEach((a) => Utils.upsertAddressTriggers(a, userStorage));\n\n const newTriggers = Utils.traverseUserStorageTriggers(userStorage, {\n mapTrigger: (t) => {\n if (!t.enabled) {\n return t;\n }\n return undefined;\n },\n });\n\n // Create any missing triggers.\n if (newTriggers.length > 0) {\n // Write te updated userStorage (where triggers are disabled)\n await this.#storage.setNotificationStorage(JSON.stringify(userStorage));\n\n // Create the triggers\n const triggers = Utils.traverseUserStorageTriggers(userStorage, {\n mapTrigger: (t) => {\n if (\n accounts.some((a) => a.toLowerCase() === t.address.toLowerCase())\n ) {\n return t;\n }\n return undefined;\n },\n });\n await OnChainNotifications.createOnChainTriggers(\n userStorage,\n storageKey,\n bearerToken,\n triggers,\n );\n }\n\n // Update Push Notifications Triggers\n const UUIDs = Utils.getAllUUIDs(userStorage);\n await this.#pushNotifications.updatePushNotifications(UUIDs);\n\n // Update the userStorage (where triggers are enabled)\n await this.#storage.setNotificationStorage(JSON.stringify(userStorage));\n return userStorage;\n } catch (err) {\n log.error('Failed to update OnChain triggers', err);\n throw new Error('Failed to update OnChain triggers');\n } finally {\n this.#clearUpdatingAccountsState(accounts);\n }\n }\n\n /**\n * Fetches the list of metamask notifications.\n * This includes OnChain notifications and Feature Announcements.\n *\n * **Action** - When a user views the notification list page/dropdown\n *\n * @param previewToken - the preview token to use if needed\n * @throws {Error} Throws an error if unauthenticated or from other operations.\n */\n public async fetchAndUpdateMetamaskNotifications(\n previewToken?: string,\n ): Promise<INotification[]> {\n try {\n this.#setIsFetchingMetamaskNotifications(true);\n\n // Raw Feature Notifications\n const rawFeatureAnnouncementNotifications = this.state\n .isFeatureAnnouncementsEnabled\n ? await FeatureNotifications.getFeatureAnnouncementNotifications(\n this.#featureAnnouncementEnv,\n previewToken,\n ).catch(() => [])\n : [];\n\n // Raw On Chain Notifications\n const rawOnChainNotifications: OnChainRawNotification[] = [];\n const userStorage = await this.#storage\n .getNotificationStorage()\n .then((s) => s && (JSON.parse(s) as UserStorage))\n .catch(() => null);\n const bearerToken = await this.#auth.getBearerToken().catch(() => null);\n if (userStorage && bearerToken) {\n const notifications =\n await OnChainNotifications.getOnChainNotifications(\n userStorage,\n bearerToken,\n ).catch(() => []);\n\n rawOnChainNotifications.push(...notifications);\n }\n\n const readIds = this.state.metamaskNotificationsReadList;\n\n // Combined Notifications\n const isNotUndefined = <Item>(t?: Item): t is Item => Boolean(t);\n const processAndFilter = (ns: RawNotificationUnion[]) =>\n ns\n .map((n) => safeProcessNotification(n, readIds))\n .filter(isNotUndefined);\n\n const featureAnnouncementNotifications = processAndFilter(\n rawFeatureAnnouncementNotifications,\n );\n const onChainNotifications = processAndFilter(rawOnChainNotifications);\n\n const snapNotifications = this.state.metamaskNotificationsList.filter(\n (notification) => notification.type === TRIGGER_TYPES.SNAP,\n );\n\n const metamaskNotifications: INotification[] = [\n ...featureAnnouncementNotifications,\n ...onChainNotifications,\n ...snapNotifications,\n ];\n metamaskNotifications.sort(\n (a, b) =>\n new Date(b.createdAt).getTime() - new Date(a.createdAt).getTime(),\n );\n\n // Update State\n this.update((state) => {\n state.metamaskNotificationsList = metamaskNotifications;\n });\n\n this.messagingSystem.publish(\n `${controllerName}:notificationsListUpdated`,\n this.state.metamaskNotificationsList,\n );\n\n this.#setIsFetchingMetamaskNotifications(false);\n return metamaskNotifications;\n } catch (err) {\n this.#setIsFetchingMetamaskNotifications(false);\n log.error('Failed to fetch notifications', err);\n throw new Error('Failed to fetch notifications');\n }\n }\n\n /**\n * Gets the specified type of notifications from state.\n *\n * @param type - The trigger type.\n * @returns An array of notifications of the passed in type.\n * @throws Throws an error if an invalid trigger type is passed.\n */\n public getNotificationsByType(type: TRIGGER_TYPES) {\n assert(\n Object.values(TRIGGER_TYPES).includes(type),\n 'Invalid trigger type.',\n );\n return this.state.metamaskNotificationsList.filter(\n (notification) => notification.type === type,\n );\n }\n\n /**\n * Used to delete a notification by id.\n *\n * Note: This function should only be used for notifications that are stored\n * in this controller directly, currently only snaps notifications.\n *\n * @param id - The id of the notification to delete.\n */\n public async deleteNotificationById(id: string) {\n const fetchedNotification = this.state.metamaskNotificationsList.find(\n (notification) => notification.id === id,\n );\n\n assert(\n fetchedNotification,\n 'The notification to be deleted does not exist.',\n );\n\n assert(\n locallyPersistedNotificationTypes.has(fetchedNotification.type),\n `The notification type of \"${\n // notifications are guaranteed to have type properties which equate to strings\n fetchedNotification.type as string\n }\" is not locally persisted, only the following types can use this function: ${[\n ...locallyPersistedNotificationTypes,\n ].join(', ')}.`,\n );\n\n const newList = this.state.metamaskNotificationsList.filter(\n (notification) => notification.id !== id,\n );\n\n this.update((state) => {\n state.metamaskNotificationsList = newList;\n });\n }\n\n /**\n * Used to batch delete notifications by id.\n *\n * Note: This function should only be used for notifications that are stored\n * in this controller directly, currently only snaps notifications.\n *\n * @param ids - The ids of the notifications to delete.\n */\n public async deleteNotificationsById(ids: string[]) {\n for (const id of ids) {\n await this.deleteNotificationById(id);\n }\n }\n\n /**\n * Marks specified metamask notifications as read.\n *\n * @param notifications - An array of notifications to be marked as read. Each notification should include its type and read status.\n * @returns A promise that resolves when the operation is complete.\n */\n public async markMetamaskNotificationsAsRead(\n notifications: MarkAsReadNotificationsParam,\n ): Promise<void> {\n let onchainNotificationIds: string[] = [];\n let featureAnnouncementNotificationIds: string[] = [];\n let snapNotificationIds: string[] = [];\n\n try {\n const [\n onChainNotifications,\n featureAnnouncementNotifications,\n snapNotifications,\n ] = notifications.reduce<\n [\n MarkAsReadNotificationsParam,\n MarkAsReadNotificationsParam,\n MarkAsReadNotificationsParam,\n ]\n >(\n (allNotifications, notification) => {\n if (!notification.isRead) {\n switch (notification.type) {\n case TRIGGER_TYPES.FEATURES_ANNOUNCEMENT:\n allNotifications[1].push(notification);\n break;\n case TRIGGER_TYPES.SNAP:\n allNotifications[2].push(notification);\n break;\n default:\n allNotifications[0].push(notification);\n }\n }\n return allNotifications;\n },\n [[], [], []],\n );\n\n // Mark On-Chain Notifications as Read\n if (onChainNotifications.length > 0) {\n const bearerToken = await this.#auth.getBearerToken();\n\n if (bearerToken) {\n onchainNotificationIds = onChainNotifications.map(\n (notification) => notification.id,\n );\n await OnChainNotifications.markNotificationsAsRead(\n bearerToken,\n onchainNotificationIds,\n ).catch(() => {\n onchainNotificationIds = [];\n log.warn('Unable to mark onchain notifications as read');\n });\n }\n }\n\n // Mark Off-Chain notifications as Read\n if (featureAnnouncementNotifications.length > 0) {\n featureAnnouncementNotificationIds =\n featureAnnouncementNotifications.map(\n (notification) => notification.id,\n );\n }\n\n if (snapNotifications.length > 0) {\n snapNotificationIds = snapNotifications.map(\n (notification) => notification.id,\n );\n }\n } catch (err) {\n log.warn('Something failed when marking notifications as read', err);\n }\n\n // Update the state (state is also used on counter & badge)\n this.update((state) => {\n const currentReadList = state.metamaskNotificationsReadList;\n const newReadIds = [\n ...featureAnnouncementNotificationIds,\n ...snapNotificationIds,\n ];\n state.metamaskNotificationsReadList = [\n ...new Set([...currentReadList, ...newReadIds]),\n ];\n\n state.metamaskNotificationsList = state.metamaskNotificationsList.map(\n (notification: INotification) => {\n if (\n newReadIds.includes(notification.id) ||\n onchainNotificationIds.includes(notification.id)\n ) {\n if (notification.type === TRIGGER_TYPES.SNAP) {\n return {\n ...notification,\n isRead: true,\n readDate: new Date().toISOString(),\n };\n }\n return { ...notification, isRead: true };\n }\n return notification;\n },\n );\n });\n\n this.messagingSystem.publish(\n `${controllerName}:markNotificationsAsRead`,\n this.state.metamaskNotificationsList,\n );\n }\n\n /**\n * Updates the list of MetaMask notifications by adding a new notification at the beginning of the list.\n * This method ensures that the most recent notification is displayed first in the UI.\n *\n * @param notification - The new notification object to be added to the list.\n * @returns A promise that resolves when the notification list has been successfully updated.\n */\n public async updateMetamaskNotificationsList(\n notification: INotification,\n ): Promise<void> {\n if (\n this.state.metamaskNotificationsList.some((n) => n.id === notification.id)\n ) {\n return;\n }\n\n const processedNotification = safeProcessNotification(notification);\n\n if (processedNotification) {\n this.update((state) => {\n const existingNotificationIds = new Set(\n state.metamaskNotificationsList.map((n) => n.id),\n );\n // Add the new notification only if its ID is not already present in the list\n if (!existingNotificationIds.has(processedNotification.id)) {\n state.metamaskNotificationsList = [\n processedNotification,\n ...state.metamaskNotificationsList,\n ];\n }\n });\n\n this.messagingSystem.publish(\n `${controllerName}:notificationsListUpdated`,\n this.state.metamaskNotificationsList,\n );\n }\n }\n}\n"]}
@@ -2,6 +2,7 @@ import type { RestrictedControllerMessenger, ControllerGetStateAction, Controlle
2
2
  import { BaseController } from "@metamask/base-controller";
3
3
  import type { KeyringControllerGetAccountsAction, KeyringControllerStateChangeEvent, KeyringControllerGetStateAction, KeyringControllerLockEvent, KeyringControllerUnlockEvent } from "@metamask/keyring-controller";
4
4
  import type { AuthenticationController, UserStorageController } from "@metamask/profile-sync-controller";
5
+ import { TRIGGER_TYPES } from "./constants/notification-schema.cjs";
5
6
  import type { INotification, MarkAsReadNotificationsParam } from "./types/notification/notification.cjs";
6
7
  import type { UserStorage } from "./types/user-storage/user-storage.cjs";
7
8
  export type NotificationServicesPushControllerEnablePushNotifications = {
@@ -87,7 +88,15 @@ export type NotificationServicesControllerSelectIsNotificationServicesEnabled =
87
88
  type: `${typeof controllerName}:selectIsNotificationServicesEnabled`;
88
89
  handler: NotificationServicesController['selectIsNotificationServicesEnabled'];
89
90
  };
90
- export type Actions = NotificationServicesControllerGetStateAction | NotificationServicesControllerUpdateMetamaskNotificationsList | NotificationServicesControllerDisableNotificationServices | NotificationServicesControllerSelectIsNotificationServicesEnabled;
91
+ export type NotificationServicesControllerGetNotificationsByType = {
92
+ type: `${typeof controllerName}:getNotificationsByType`;
93
+ handler: NotificationServicesController['getNotificationsByType'];
94
+ };
95
+ export type NotificationServicesControllerDeleteNotificationsById = {
96
+ type: `${typeof controllerName}:deleteNotificationsById`;
97
+ handler: NotificationServicesController['deleteNotificationsById'];
98
+ };
99
+ export type Actions = NotificationServicesControllerGetStateAction | NotificationServicesControllerUpdateMetamaskNotificationsList | NotificationServicesControllerDisableNotificationServices | NotificationServicesControllerSelectIsNotificationServicesEnabled | NotificationServicesControllerGetNotificationsByType | NotificationServicesControllerDeleteNotificationsById;
91
100
  export type AllowedActions = KeyringControllerGetAccountsAction | KeyringControllerGetStateAction | AuthenticationController.AuthenticationControllerGetBearerToken | AuthenticationController.AuthenticationControllerIsSignedIn | UserStorageController.UserStorageControllerEnableProfileSyncing | UserStorageController.UserStorageControllerGetStorageKey | UserStorageController.UserStorageControllerPerformGetStorage | UserStorageController.UserStorageControllerPerformSetStorage | NotificationServicesPushControllerEnablePushNotifications | NotificationServicesPushControllerDisablePushNotifications | NotificationServicesPushControllerUpdateTriggerPushNotifications | NotificationServicesPushControllerSubscribeToNotifications;
92
101
  export type NotificationServicesControllerStateChangeEvent = ControllerStateChangeEvent<typeof controllerName, NotificationServicesControllerState>;
93
102
  export type NotificationListUpdatedEvent = {
@@ -224,6 +233,32 @@ export default class NotificationServicesController extends BaseController<typeo
224
233
  * @throws {Error} Throws an error if unauthenticated or from other operations.
225
234
  */
226
235
  fetchAndUpdateMetamaskNotifications(previewToken?: string): Promise<INotification[]>;
236
+ /**
237
+ * Gets the specified type of notifications from state.
238
+ *
239
+ * @param type - The trigger type.
240
+ * @returns An array of notifications of the passed in type.
241
+ * @throws Throws an error if an invalid trigger type is passed.
242
+ */
243
+ getNotificationsByType(type: TRIGGER_TYPES): INotification[];
244
+ /**
245
+ * Used to delete a notification by id.
246
+ *
247
+ * Note: This function should only be used for notifications that are stored
248
+ * in this controller directly, currently only snaps notifications.
249
+ *
250
+ * @param id - The id of the notification to delete.
251
+ */
252
+ deleteNotificationById(id: string): Promise<void>;
253
+ /**
254
+ * Used to batch delete notifications by id.
255
+ *
256
+ * Note: This function should only be used for notifications that are stored
257
+ * in this controller directly, currently only snaps notifications.
258
+ *
259
+ * @param ids - The ids of the notifications to delete.
260
+ */
261
+ deleteNotificationsById(ids: string[]): Promise<void>;
227
262
  /**
228
263
  * Marks specified metamask notifications as read.
229
264
  *
@@ -1 +1 @@
1
- {"version":3,"file":"NotificationServicesController.d.cts","sourceRoot":"","sources":["../../src/NotificationServicesController/NotificationServicesController.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,6BAA6B,EAC7B,wBAAwB,EACxB,0BAA0B,EAE3B,kCAAkC;AACnC,OAAO,EAAE,cAAc,EAAE,kCAAkC;AAE3D,OAAO,KAAK,EACV,kCAAkC,EAClC,iCAAiC,EACjC,+BAA+B,EAC/B,0BAA0B,EAC1B,4BAA4B,EAC7B,qCAAqC;AACtC,OAAO,KAAK,EACV,wBAAwB,EACxB,qBAAqB,EACtB,0CAA0C;AAQ3C,OAAO,KAAK,EACV,aAAa,EACb,4BAA4B,EAE7B,8CAA0C;AAE3C,OAAO,KAAK,EAAE,WAAW,EAAE,8CAA0C;AAKrE,MAAM,MAAM,yDAAyD,GAAG;IACtE,IAAI,EAAE,4DAA4D,CAAC;IACnE,OAAO,EAAE,CAAC,KAAK,EAAE,MAAM,EAAE,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;CAC7C,CAAC;AAEF,MAAM,MAAM,0DAA0D,GAAG;IACvE,IAAI,EAAE,6DAA6D,CAAC;IACpE,OAAO,EAAE,CAAC,KAAK,EAAE,MAAM,EAAE,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;CAC7C,CAAC;AAEF,MAAM,MAAM,gEAAgE,GAAG;IAC7E,IAAI,EAAE,mEAAmE,CAAC;IAC1E,OAAO,EAAE,CAAC,KAAK,EAAE,MAAM,EAAE,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;CAC7C,CAAC;AAEF,MAAM,MAAM,0DAA0D,GAAG;IACvE,IAAI,EAAE,iEAAiE,CAAC;IACxE,OAAO,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;CAC9B,CAAC;AAEF,MAAM,MAAM,mDAAmD,GAAG;IAChE,IAAI,EAAE,uDAAuD,CAAC;IAC9D,OAAO,EAAE,CAAC,aAAa,CAAC,CAAC;CAC1B,CAAC;AAGF,QAAA,MAAM,cAAc,mCAAmC,CAAC;AAExD;;GAEG;AACH,MAAM,MAAM,mCAAmC,GAAG;IAChD;;;OAGG;IACH,wBAAwB,EAAE,MAAM,EAAE,CAAC;IAEnC;;OAEG;IACH,kCAAkC,EAAE,OAAO,CAAC;IAE5C;;OAEG;IACH,6BAA6B,EAAE,OAAO,CAAC;IAEvC;;OAEG;IACH,6BAA6B,EAAE,OAAO,CAAC;IAEvC;;OAEG;IACH,yBAAyB,EAAE,aAAa,EAAE,CAAC;IAE3C;;OAEG;IACH,6BAA6B,EAAE,MAAM,EAAE,CAAC;IACxC;;OAEG;IACH,+BAA+B,EAAE,OAAO,CAAC;IACzC;;;;OAIG;IACH,+BAA+B,EAAE,OAAO,CAAC;IACzC;;OAEG;IACH,sCAAsC,EAAE,MAAM,EAAE,CAAC;IACjD;;OAEG;IACH,0BAA0B,EAAE,OAAO,CAAC;CACrC,CAAC;AA6CF,eAAO,MAAM,YAAY,EAAE,mCAW1B,CAAC;AAEF,MAAM,MAAM,4CAA4C,GACtD,wBAAwB,CACtB,OAAO,cAAc,EACrB,mCAAmC,CACpC,CAAC;AAEJ,MAAM,MAAM,6DAA6D,GAAG;IAC1E,IAAI,EAAE,GAAG,OAAO,cAAc,kCAAkC,CAAC;IACjE,OAAO,EAAE,8BAA8B,CAAC,iCAAiC,CAAC,CAAC;CAC5E,CAAC;AAEF,MAAM,MAAM,yDAAyD,GAAG;IACtE,IAAI,EAAE,GAAG,OAAO,cAAc,8BAA8B,CAAC;IAC7D,OAAO,EAAE,8BAA8B,CAAC,6BAA6B,CAAC,CAAC;CACxE,CAAC;AAEF,MAAM,MAAM,iEAAiE,GAC3E;IACE,IAAI,EAAE,GAAG,OAAO,cAAc,sCAAsC,CAAC;IACrE,OAAO,EAAE,8BAA8B,CAAC,qCAAqC,CAAC,CAAC;CAChF,CAAC;AAGJ,MAAM,MAAM,OAAO,GACf,4CAA4C,GAC5C,6DAA6D,GAC7D,yDAAyD,GACzD,iEAAiE,CAAC;AAGtE,MAAM,MAAM,cAAc,GAEtB,kCAAkC,GAClC,+BAA+B,GAE/B,wBAAwB,CAAC,sCAAsC,GAC/D,wBAAwB,CAAC,kCAAkC,GAE3D,qBAAqB,CAAC,yCAAyC,GAC/D,qBAAqB,CAAC,kCAAkC,GACxD,qBAAqB,CAAC,sCAAsC,GAC5D,qBAAqB,CAAC,sCAAsC,GAE5D,yDAAyD,GACzD,0DAA0D,GAC1D,gEAAgE,GAChE,0DAA0D,CAAC;AAG/D,MAAM,MAAM,8CAA8C,GACxD,0BAA0B,CACxB,OAAO,cAAc,EACrB,mCAAmC,CACpC,CAAC;AAEJ,MAAM,MAAM,4BAA4B,GAAG;IACzC,IAAI,EAAE,GAAG,OAAO,cAAc,2BAA2B,CAAC;IAC1D,OAAO,EAAE,CAAC,aAAa,EAAE,CAAC,CAAC;CAC5B,CAAC;AAEF,MAAM,MAAM,4BAA4B,GAAG;IACzC,IAAI,EAAE,GAAG,OAAO,cAAc,0BAA0B,CAAC;IACzD,OAAO,EAAE,CAAC,aAAa,EAAE,CAAC,CAAC;CAC5B,CAAC;AAGF,MAAM,MAAM,MAAM,GACd,8CAA8C,GAC9C,4BAA4B,GAC5B,4BAA4B,CAAC;AAGjC,MAAM,MAAM,aAAa,GAErB,iCAAiC,GACjC,0BAA0B,GAC1B,4BAA4B,GAE5B,mDAAmD,CAAC;AAGxD,MAAM,MAAM,uCAAuC,GACjD,6BAA6B,CAC3B,OAAO,cAAc,EACrB,OAAO,GAAG,cAAc,EACxB,MAAM,GAAG,aAAa,EACtB,cAAc,CAAC,MAAM,CAAC,EACtB,aAAa,CAAC,MAAM,CAAC,CACtB,CAAC;AAEJ,KAAK,sBAAsB,GAAG;IAC5B,OAAO,EAAE,MAAM,CAAC;IAChB,WAAW,EAAE,MAAM,CAAC;IACpB,QAAQ,EAAE,WAAW,GAAG,QAAQ,CAAC;CAClC,CAAC;AAEF;;GAEG;AACH,MAAM,CAAC,OAAO,OAAO,8BAA+B,SAAQ,cAAc,CACxE,OAAO,cAAc,EACrB,mCAAmC,EACnC,uCAAuC,CACxC;;IA4OC;;;;;;;;;OASG;gBACS,EACV,SAAS,EACT,KAAK,EACL,GAAG,GACJ,EAAE;QACD,SAAS,EAAE,uCAAuC,CAAC;QACnD,KAAK,CAAC,EAAE,OAAO,CAAC,mCAAmC,CAAC,CAAC;QACrD,GAAG,EAAE;YACH,oBAAoB,EAAE,sBAAsB,CAAC;YAC7C,gBAAgB,CAAC,EAAE,OAAO,CAAC;SAC5B,CAAC;KACH;IAmHD;;;;;;;OAOG;IACI,mCAAmC,IAAI,OAAO;IAmFxC,qBAAqB,CAChC,QAAQ,EAAE,MAAM,EAAE,GACjB,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAkBnC;;;;;;;;OAQG;IACU,8BAA8B,CACzC,2BAA2B,EAAE,OAAO;IAYtC;;;;;;;;;;OAUG;IACU,qBAAqB,CAAC,IAAI,CAAC,EAAE;QACxC,kBAAkB,CAAC,EAAE,OAAO,CAAC;KAC9B,GAAG,OAAO,CAAC,WAAW,CAAC;IA+DxB;;;;;;;;;OASG;IACU,2BAA2B;IAYxC;;;;;;;OAOG;IACU,2BAA2B;IAwBxC;;;;;;;;;;;;;OAaG;IACU,8BAA8B,CACzC,QAAQ,EAAE,MAAM,EAAE,GACjB,OAAO,CAAC,WAAW,CAAC;IA0CvB;;;;;;;;;;;;;;OAcG;IACU,8BAA8B,CACzC,QAAQ,EAAE,MAAM,EAAE,GACjB,OAAO,CAAC,WAAW,CAAC;IA8DvB;;;;;;;;OAQG;IACU,mCAAmC,CAC9C,YAAY,CAAC,EAAE,MAAM,GACpB,OAAO,CAAC,aAAa,EAAE,CAAC;IAwE3B;;;;;OAKG;IACU,+BAA+B,CAC1C,aAAa,EAAE,4BAA4B,GAC1C,OAAO,CAAC,IAAI,CAAC;IA0EhB;;;;;;OAMG;IACU,+BAA+B,CAC1C,YAAY,EAAE,aAAa,GAC1B,OAAO,CAAC,IAAI,CAAC;CA4BjB"}
1
+ {"version":3,"file":"NotificationServicesController.d.cts","sourceRoot":"","sources":["../../src/NotificationServicesController/NotificationServicesController.ts"],"names":[],"mappings":"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"}