@metamask-previews/message-manager 11.0.3-preview-ca1f35f → 11.0.3-preview-e05b7d3e

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.
@@ -1,8 +1,8 @@
1
1
  /// <reference types="node" />
2
- import type { BaseConfig, BaseState } from "@metamask/base-controller";
3
- import { BaseControllerV1 } from "@metamask/base-controller";
2
+ import { BaseController } from "@metamask/base-controller";
3
+ import type { ActionConstraint, EventConstraint, RestrictedControllerMessenger } from "@metamask/base-controller";
4
4
  import type { ApprovalType } from "@metamask/controller-utils";
5
- import type { Hex, Json } from "@metamask/utils";
5
+ import type { Json } from "@metamask/utils";
6
6
  import { EventEmitter } from "events";
7
7
  /**
8
8
  * @type OriginalRequest
@@ -10,13 +10,13 @@ import { EventEmitter } from "events";
10
10
  * Represents the original request object for adding a message.
11
11
  * @property origin? - Is it is specified, represents the origin
12
12
  */
13
- export interface OriginalRequest {
13
+ export type OriginalRequest = {
14
14
  id?: number;
15
15
  origin?: string;
16
16
  securityAlertResponse?: Record<string, Json>;
17
- }
17
+ };
18
18
  /**
19
- * @type Message
19
+ * @type AbstractMessage
20
20
  *
21
21
  * Represents and contains data about a signing type signature request.
22
22
  * @property id - An id to track and identify the message object
@@ -26,7 +26,7 @@ export interface OriginalRequest {
26
26
  * @property securityProviderResponse - Response from a security provider, whether it is malicious or not
27
27
  * @property metadata - Additional data for the message, for example external identifiers
28
28
  */
29
- export interface AbstractMessage {
29
+ export type AbstractMessage = {
30
30
  id: string;
31
31
  time: number;
32
32
  status: string;
@@ -36,7 +36,7 @@ export interface AbstractMessage {
36
36
  securityAlertResponse?: Record<string, Json>;
37
37
  metadata?: Json;
38
38
  error?: string;
39
- }
39
+ };
40
40
  /**
41
41
  * @type AbstractMessageParams
42
42
  *
@@ -46,12 +46,12 @@ export interface AbstractMessage {
46
46
  * @property requestId? - Original request id
47
47
  * @property deferSetAsSigned? - Whether to defer setting the message as signed immediately after the keyring is told to sign it
48
48
  */
49
- export interface AbstractMessageParams {
49
+ export type AbstractMessageParams = {
50
50
  from: string;
51
51
  origin?: string;
52
52
  requestId?: number;
53
53
  deferSetAsSigned?: boolean;
54
- }
54
+ };
55
55
  /**
56
56
  * @type MessageParamsMetamask
57
57
  *
@@ -61,9 +61,9 @@ export interface AbstractMessageParams {
61
61
  * @property from - Address from which the message is processed
62
62
  * @property origin? - Added for request origin identification
63
63
  */
64
- export interface AbstractMessageParamsMetamask extends AbstractMessageParams {
64
+ export type AbstractMessageParamsMetamask = AbstractMessageParams & {
65
65
  metamaskId?: string;
66
- }
66
+ };
67
67
  /**
68
68
  * @type MessageManagerState
69
69
  *
@@ -71,25 +71,43 @@ export interface AbstractMessageParamsMetamask extends AbstractMessageParams {
71
71
  * @property unapprovedMessages - A collection of all Messages in the 'unapproved' state
72
72
  * @property unapprovedMessagesCount - The count of all Messages in this.unapprovedMessages
73
73
  */
74
- export interface MessageManagerState<M extends AbstractMessage> extends BaseState {
75
- unapprovedMessages: {
76
- [key: string]: M;
77
- };
74
+ export type MessageManagerState<Message extends AbstractMessage> = {
75
+ unapprovedMessages: Record<string, Message>;
78
76
  unapprovedMessagesCount: number;
79
- }
77
+ };
78
+ export type UpdateBadgeEvent = {
79
+ type: `${string}:updateBadge`;
80
+ payload: [];
81
+ };
80
82
  /**
81
83
  * A function for verifying a message, whether it is malicious or not
82
84
  */
83
85
  export type SecurityProviderRequest = (requestData: AbstractMessage, messageType: string) => Promise<Json>;
84
- type getCurrentChainId = () => Hex;
86
+ /**
87
+ * AbstractMessageManager constructor options.
88
+ *
89
+ * @property additionalFinishStatuses - Optional list of statuses that are accepted to emit a finished event.
90
+ * @property messenger - Controller messaging system.
91
+ * @property name - The name of the manager.
92
+ * @property securityProviderRequest - A function for verifying a message, whether it is malicious or not.
93
+ * @property state - Initial state to set on this controller.
94
+ */
95
+ export type AbstractMessageManagerOptions<Message extends AbstractMessage, Action extends ActionConstraint, Event extends EventConstraint> = {
96
+ additionalFinishStatuses?: string[];
97
+ messenger: RestrictedControllerMessenger<string, Action, Event | UpdateBadgeEvent, string, string>;
98
+ name: string;
99
+ securityProviderRequest?: SecurityProviderRequest;
100
+ state?: MessageManagerState<Message>;
101
+ };
85
102
  /**
86
103
  * Controller in charge of managing - storing, adding, removing, updating - Messages.
87
104
  */
88
- export declare abstract class AbstractMessageManager<M extends AbstractMessage, P extends AbstractMessageParams, PM extends AbstractMessageParamsMetamask> extends BaseControllerV1<BaseConfig, MessageManagerState<M>> {
89
- protected messages: M[];
90
- protected getCurrentChainId: getCurrentChainId | undefined;
105
+ export declare abstract class AbstractMessageManager<Message extends AbstractMessage, Params extends AbstractMessageParams, ParamsMetamask extends AbstractMessageParamsMetamask, Action extends ActionConstraint, Event extends EventConstraint> extends BaseController<string, MessageManagerState<Message>, RestrictedControllerMessenger<string, Action, Event | UpdateBadgeEvent, string, string>> {
106
+ protected messages: Message[];
91
107
  private readonly securityProviderRequest;
92
108
  private readonly additionalFinishStatuses;
109
+ internalEvents: EventEmitter<[never]>;
110
+ constructor({ additionalFinishStatuses, messenger, name, securityProviderRequest, state, }: AbstractMessageManagerOptions<Message, Action, Event>);
93
111
  /**
94
112
  * Adds request props to the messsage params and returns a new messageParams object.
95
113
  * @param messageParams - The messageParams to add the request props to.
@@ -132,7 +150,7 @@ export declare abstract class AbstractMessageManager<M extends AbstractMessage,
132
150
  * @param message - A Message that will replace an existing Message (with the id) in this.messages.
133
151
  * @param emitUpdateBadge - Whether to emit the updateBadge event.
134
152
  */
135
- protected updateMessage(message: M, emitUpdateBadge?: boolean): void;
153
+ protected updateMessage(message: Message, emitUpdateBadge?: boolean): void;
136
154
  /**
137
155
  * Verifies a message is malicious or not by checking it against a security provider.
138
156
  *
@@ -140,24 +158,7 @@ export declare abstract class AbstractMessageManager<M extends AbstractMessage,
140
158
  * @returns A promise that resolves to a secured message with additional security provider response data.
141
159
  */
142
160
  private securityCheck;
143
- /**
144
- * EventEmitter instance used to listen to specific message events
145
- */
146
- hub: EventEmitter;
147
- /**
148
- * Name of this controller used during composition
149
- */
150
- name: string;
151
- /**
152
- * Creates an AbstractMessageManager instance.
153
- *
154
- * @param config - Initial options used to configure this controller.
155
- * @param state - Initial state to set on this controller.
156
- * @param securityProviderRequest - A function for verifying a message, whether it is malicious or not.
157
- * @param additionalFinishStatuses - Optional list of statuses that are accepted to emit a finished event.
158
- * @param getCurrentChainId - Optional function to get the current chainId.
159
- */
160
- constructor(config?: Partial<BaseConfig>, state?: Partial<MessageManagerState<M>>, securityProviderRequest?: SecurityProviderRequest, additionalFinishStatuses?: string[], getCurrentChainId?: getCurrentChainId);
161
+ clearUnapprovedMessages(): void;
161
162
  /**
162
163
  * A getter for the number of 'unapproved' Messages in this.messages.
163
164
  *
@@ -169,16 +170,14 @@ export declare abstract class AbstractMessageManager<M extends AbstractMessage,
169
170
  *
170
171
  * @returns An index of Message ids to Messages, for all 'unapproved' Messages in this.messages.
171
172
  */
172
- getUnapprovedMessages(): {
173
- [key: string]: M;
174
- };
173
+ getUnapprovedMessages(): Record<string, Message>;
175
174
  /**
176
175
  * Adds a passed Message to this.messages, and calls this.saveMessageList() to save
177
176
  * the unapproved Messages from that list to this.messages.
178
177
  *
179
178
  * @param message - The Message to add to this.messages.
180
179
  */
181
- addMessage(message: M): Promise<void>;
180
+ addMessage(message: Message): Promise<void>;
182
181
  /**
183
182
  * Returns a specified Message.
184
183
  *
@@ -186,13 +185,13 @@ export declare abstract class AbstractMessageManager<M extends AbstractMessage,
186
185
  * @returns The Message with the id that matches the passed messageId, or undefined
187
186
  * if no Message has that id.
188
187
  */
189
- getMessage(messageId: string): M | undefined;
188
+ getMessage(messageId: string): Message | undefined;
190
189
  /**
191
190
  * Returns all the messages.
192
191
  *
193
192
  * @returns An array of messages.
194
193
  */
195
- getAllMessages(): M[];
194
+ getAllMessages(): Message[];
196
195
  /**
197
196
  * Approves a Message. Sets the message status via a call to this.setMessageStatusApproved,
198
197
  * and returns a promise with any the message params modified for proper signing.
@@ -201,7 +200,7 @@ export declare abstract class AbstractMessageManager<M extends AbstractMessage,
201
200
  * plus data added by MetaMask.
202
201
  * @returns Promise resolving to the messageParams with the metamaskId property removed.
203
202
  */
204
- approveMessage(messageParams: PM): Promise<P>;
203
+ approveMessage(messageParams: ParamsMetamask): Promise<Params>;
205
204
  /**
206
205
  * Sets a Message status to 'approved' via a call to this.setMessageStatus.
207
206
  *
@@ -253,7 +252,7 @@ export declare abstract class AbstractMessageManager<M extends AbstractMessage,
253
252
  * @param messageParams - The messageParams to modify
254
253
  * @returns Promise resolving to the messageParams with the metamaskId property removed
255
254
  */
256
- abstract prepMessageForSigning(messageParams: PM): Promise<P>;
255
+ abstract prepMessageForSigning(messageParams: ParamsMetamask): Promise<Params>;
257
256
  /**
258
257
  * Creates a new Message with an 'unapproved' status using the passed messageParams.
259
258
  * this.addMessage is called to add the new Message to this.messages, and to save the
@@ -264,7 +263,7 @@ export declare abstract class AbstractMessageManager<M extends AbstractMessage,
264
263
  * @param version? - The version of the JSON RPC protocol the request is using.
265
264
  * @returns The id of the newly created message.
266
265
  */
267
- abstract addUnapprovedMessage(messageParams: PM, request: OriginalRequest, version?: string): Promise<string>;
266
+ abstract addUnapprovedMessage(messageParams: ParamsMetamask, request: OriginalRequest, version?: string): Promise<string>;
268
267
  /**
269
268
  * Sets a Message status to 'rejected' via a call to this.setMessageStatus.
270
269
  *
@@ -1 +1 @@
1
- {"version":3,"file":"AbstractMessageManager.d.mts","sourceRoot":"","sources":["../src/AbstractMessageManager.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"AbstractMessageManager.d.mts","sourceRoot":"","sources":["../src/AbstractMessageManager.ts"],"names":[],"mappings":"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"}
@@ -1,12 +1,35 @@
1
- import { BaseControllerV1 } from "@metamask/base-controller";
1
+ import { BaseController } from "@metamask/base-controller";
2
2
  // This package purposefully relies on Node's EventEmitter module.
3
- // eslint-disable-next-line import/no-nodejs-modules
3
+ // eslint-disable-next-line import-x/no-nodejs-modules
4
4
  import { EventEmitter } from "events";
5
5
  import { v1 as random } from "uuid";
6
+ const stateMetadata = {
7
+ unapprovedMessages: { persist: false, anonymous: false },
8
+ unapprovedMessagesCount: { persist: false, anonymous: false },
9
+ };
10
+ const getDefaultState = () => ({
11
+ unapprovedMessages: {},
12
+ unapprovedMessagesCount: 0,
13
+ });
6
14
  /**
7
15
  * Controller in charge of managing - storing, adding, removing, updating - Messages.
8
16
  */
9
- export class AbstractMessageManager extends BaseControllerV1 {
17
+ export class AbstractMessageManager extends BaseController {
18
+ constructor({ additionalFinishStatuses, messenger, name, securityProviderRequest, state = {}, }) {
19
+ super({
20
+ messenger,
21
+ metadata: stateMetadata,
22
+ name,
23
+ state: {
24
+ ...getDefaultState(),
25
+ ...state,
26
+ },
27
+ });
28
+ this.internalEvents = new EventEmitter();
29
+ this.messages = [];
30
+ this.securityProviderRequest = securityProviderRequest;
31
+ this.additionalFinishStatuses = additionalFinishStatuses ?? [];
32
+ }
10
33
  /**
11
34
  * Adds request props to the messsage params and returns a new messageParams object.
12
35
  * @param messageParams - The messageParams to add the request props to.
@@ -47,11 +70,13 @@ export class AbstractMessageManager extends BaseControllerV1 {
47
70
  * @param emitUpdateBadge - Whether to emit the updateBadge event.
48
71
  */
49
72
  saveMessageList(emitUpdateBadge = true) {
50
- const unapprovedMessages = this.getUnapprovedMessages();
51
- const unapprovedMessagesCount = this.getUnapprovedMessagesCount();
52
- this.update({ unapprovedMessages, unapprovedMessagesCount });
73
+ this.update((state) => {
74
+ state.unapprovedMessages =
75
+ this.getUnapprovedMessages();
76
+ state.unapprovedMessagesCount = this.getUnapprovedMessagesCount();
77
+ });
53
78
  if (emitUpdateBadge) {
54
- this.hub.emit('updateBadge');
79
+ this.messagingSystem.publish(`${this.name}:updateBadge`);
55
80
  }
56
81
  }
57
82
  /**
@@ -65,14 +90,17 @@ export class AbstractMessageManager extends BaseControllerV1 {
65
90
  if (!message) {
66
91
  throw new Error(`${this.name}: Message not found for id: ${messageId}.`);
67
92
  }
68
- message.status = status;
69
- this.updateMessage(message);
70
- this.hub.emit(`${messageId}:${status}`, message);
93
+ const updatedMessage = {
94
+ ...message,
95
+ status,
96
+ };
97
+ this.updateMessage(updatedMessage);
98
+ this.internalEvents.emit(`${messageId}:${status}`, updatedMessage);
71
99
  if (status === 'rejected' ||
72
100
  status === 'signed' ||
73
101
  status === 'errored' ||
74
102
  this.additionalFinishStatuses.includes(status)) {
75
- this.hub.emit(`${messageId}:finished`, message);
103
+ this.internalEvents.emit(`${messageId}:finished`, updatedMessage);
76
104
  }
77
105
  }
78
106
  /**
@@ -106,34 +134,11 @@ export class AbstractMessageManager extends BaseControllerV1 {
106
134
  }
107
135
  return message;
108
136
  }
109
- /**
110
- * Creates an AbstractMessageManager instance.
111
- *
112
- * @param config - Initial options used to configure this controller.
113
- * @param state - Initial state to set on this controller.
114
- * @param securityProviderRequest - A function for verifying a message, whether it is malicious or not.
115
- * @param additionalFinishStatuses - Optional list of statuses that are accepted to emit a finished event.
116
- * @param getCurrentChainId - Optional function to get the current chainId.
117
- */
118
- constructor(config, state, securityProviderRequest, additionalFinishStatuses, getCurrentChainId) {
119
- super(config, state);
120
- /**
121
- * EventEmitter instance used to listen to specific message events
122
- */
123
- this.hub = new EventEmitter();
124
- /**
125
- * Name of this controller used during composition
126
- */
127
- this.name = 'AbstractMessageManager';
128
- this.defaultState = {
129
- unapprovedMessages: {},
130
- unapprovedMessagesCount: 0,
131
- };
132
- this.messages = [];
133
- this.securityProviderRequest = securityProviderRequest;
134
- this.additionalFinishStatuses = additionalFinishStatuses ?? [];
135
- this.getCurrentChainId = getCurrentChainId;
136
- this.initialize();
137
+ clearUnapprovedMessages() {
138
+ this.update((state) => {
139
+ state.unapprovedMessages = {};
140
+ state.unapprovedMessagesCount = 0;
141
+ });
137
142
  }
138
143
  /**
139
144
  * A getter for the number of 'unapproved' Messages in this.messages.
@@ -250,8 +255,10 @@ export class AbstractMessageManager extends BaseControllerV1 {
250
255
  if (!message) {
251
256
  return;
252
257
  }
253
- message.rawSig = result;
254
- this.updateMessage(message, false);
258
+ this.updateMessage({
259
+ ...message,
260
+ rawSig: result,
261
+ }, false);
255
262
  }
256
263
  /**
257
264
  * Sets the messsage metadata
@@ -264,8 +271,10 @@ export class AbstractMessageManager extends BaseControllerV1 {
264
271
  if (!message) {
265
272
  throw new Error(`${this.name}: Message not found for id: ${messageId}.`);
266
273
  }
267
- message.metadata = metadata;
268
- this.updateMessage(message, false);
274
+ this.updateMessage({
275
+ ...message,
276
+ metadata,
277
+ }, false);
269
278
  }
270
279
  /**
271
280
  * Sets a Message status to 'rejected' via a call to this.setMessageStatus.
@@ -285,19 +294,14 @@ export class AbstractMessageManager extends BaseControllerV1 {
285
294
  async waitForFinishStatus(messageParamsWithId, messageName) {
286
295
  const { metamaskId: messageId, ...messageParams } = messageParamsWithId;
287
296
  return new Promise((resolve, reject) => {
288
- // TODO: Either fix this lint violation or explain why it's necessary to ignore.
289
- // eslint-disable-next-line @typescript-eslint/restrict-template-expressions
290
- this.hub.once(`${messageId}:finished`, (data) => {
297
+ this.internalEvents.once(`${messageId}:finished`, (data) => {
291
298
  switch (data.status) {
292
299
  case 'signed':
293
300
  return resolve(data.rawSig);
294
301
  case 'rejected':
295
302
  return reject(new Error(`MetaMask ${messageName} Signature: User denied message signature.`));
296
303
  case 'errored':
297
- return reject(
298
- // TODO: Either fix this lint violation or explain why it's necessary to ignore.
299
- // eslint-disable-next-line @typescript-eslint/restrict-template-expressions
300
- new Error(`MetaMask ${messageName} Signature: ${data.error}`));
304
+ return reject(new Error(`MetaMask ${messageName} Signature: ${data.error}`));
301
305
  default:
302
306
  return reject(new Error(`MetaMask ${messageName} Signature: Unknown problem: ${JSON.stringify(messageParams)}`));
303
307
  }
@@ -1 +1 @@
1
- {"version":3,"file":"AbstractMessageManager.mjs","sourceRoot":"","sources":["../src/AbstractMessageManager.ts"],"names":[],"mappings":"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","sourcesContent":["import type { BaseConfig, BaseState } from '@metamask/base-controller';\nimport { BaseControllerV1 } from '@metamask/base-controller';\nimport type { ApprovalType } from '@metamask/controller-utils';\nimport type { Hex, Json } from '@metamask/utils';\n// This package purposefully relies on Node's EventEmitter module.\n// eslint-disable-next-line import/no-nodejs-modules\nimport { EventEmitter } from 'events';\nimport { v1 as random } from 'uuid';\n\n/**\n * @type OriginalRequest\n *\n * Represents the original request object for adding a message.\n * @property origin? - Is it is specified, represents the origin\n */\n// This interface was created before this ESLint rule was added.\n// Convert to a `type` in a future major version.\n// eslint-disable-next-line @typescript-eslint/consistent-type-definitions\nexport interface OriginalRequest {\n id?: number;\n origin?: string;\n securityAlertResponse?: Record<string, Json>;\n}\n\n/**\n * @type Message\n *\n * Represents and contains data about a signing type signature request.\n * @property id - An id to track and identify the message object\n * @property type - The json-prc signing method for which a signature request has been made.\n * A 'Message' which always has a signing type\n * @property rawSig - Raw data of the signature request\n * @property securityProviderResponse - Response from a security provider, whether it is malicious or not\n * @property metadata - Additional data for the message, for example external identifiers\n */\n// This interface was created before this ESLint rule was added.\n// Convert to a `type` in a future major version.\n// eslint-disable-next-line @typescript-eslint/consistent-type-definitions\nexport interface AbstractMessage {\n id: string;\n time: number;\n status: string;\n type: string;\n rawSig?: string;\n securityProviderResponse?: Record<string, Json>;\n securityAlertResponse?: Record<string, Json>;\n metadata?: Json;\n error?: string;\n}\n\n/**\n * @type AbstractMessageParams\n *\n * Represents the parameters to pass to the signing method once the signature request is approved.\n * @property from - Address from which the message is processed\n * @property origin? - Added for request origin identification\n * @property requestId? - Original request id\n * @property deferSetAsSigned? - Whether to defer setting the message as signed immediately after the keyring is told to sign it\n */\n// This interface was created before this ESLint rule was added.\n// Convert to a `type` in a future major version.\n// eslint-disable-next-line @typescript-eslint/consistent-type-definitions\nexport interface AbstractMessageParams {\n from: string;\n origin?: string;\n requestId?: number;\n deferSetAsSigned?: boolean;\n}\n\n/**\n * @type MessageParamsMetamask\n *\n * Represents the parameters to pass to the signing method once the signature request is approved\n * plus data added by MetaMask.\n * @property metamaskId - Added for tracking and identification within MetaMask\n * @property from - Address from which the message is processed\n * @property origin? - Added for request origin identification\n */\n// This interface was created before this ESLint rule was added.\n// Convert to a `type` in a future major version.\n// eslint-disable-next-line @typescript-eslint/consistent-type-definitions\nexport interface AbstractMessageParamsMetamask extends AbstractMessageParams {\n metamaskId?: string;\n}\n\n/**\n * @type MessageManagerState\n *\n * Message Manager state\n * @property unapprovedMessages - A collection of all Messages in the 'unapproved' state\n * @property unapprovedMessagesCount - The count of all Messages in this.unapprovedMessages\n */\n// This interface was created before this ESLint rule was added.\n// Convert to a `type` in a future major version.\n// TODO: Either fix this lint violation or explain why it's necessary to ignore.\n// eslint-disable-next-line @typescript-eslint/consistent-type-definitions, @typescript-eslint/naming-convention\nexport interface MessageManagerState<M extends AbstractMessage>\n extends BaseState {\n unapprovedMessages: { [key: string]: M };\n unapprovedMessagesCount: number;\n}\n\n/**\n * A function for verifying a message, whether it is malicious or not\n */\nexport type SecurityProviderRequest = (\n requestData: AbstractMessage,\n messageType: string,\n) => Promise<Json>;\n\n// TODO: Either fix this lint violation or explain why it's necessary to ignore.\n// eslint-disable-next-line @typescript-eslint/naming-convention\ntype getCurrentChainId = () => Hex;\n\n/**\n * Controller in charge of managing - storing, adding, removing, updating - Messages.\n */\nexport abstract class AbstractMessageManager<\n // TODO: Either fix this lint violation or explain why it's necessary to ignore.\n // eslint-disable-next-line @typescript-eslint/naming-convention\n M extends AbstractMessage,\n // TODO: Either fix this lint violation or explain why it's necessary to ignore.\n // eslint-disable-next-line @typescript-eslint/naming-convention\n P extends AbstractMessageParams,\n // TODO: Either fix this lint violation or explain why it's necessary to ignore.\n // eslint-disable-next-line @typescript-eslint/naming-convention\n PM extends AbstractMessageParamsMetamask,\n> extends BaseControllerV1<BaseConfig, MessageManagerState<M>> {\n protected messages: M[];\n\n protected getCurrentChainId: getCurrentChainId | undefined;\n\n private readonly securityProviderRequest: SecurityProviderRequest | undefined;\n\n private readonly additionalFinishStatuses: string[];\n\n /**\n * Adds request props to the messsage params and returns a new messageParams object.\n * @param messageParams - The messageParams to add the request props to.\n * @param req - The original request object.\n * @returns The messageParams with the request props added.\n */\n protected addRequestToMessageParams<\n MessageParams extends AbstractMessageParams,\n >(messageParams: MessageParams, req?: OriginalRequest) {\n const updatedMessageParams = {\n ...messageParams,\n };\n\n if (req) {\n updatedMessageParams.requestId = req.id;\n updatedMessageParams.origin = req.origin;\n }\n\n return updatedMessageParams;\n }\n\n /**\n * Creates a new Message with a random id and an 'unapproved' status.\n * @param messageParams - The messageParams to add the request props to.\n * @param type - The approval type of the message.\n * @param req - The original request object.\n * @returns The new unapproved message for a specified type.\n */\n protected createUnapprovedMessage<\n MessageParams extends AbstractMessageParams,\n >(messageParams: MessageParams, type: ApprovalType, req?: OriginalRequest) {\n const messageId = random();\n\n return {\n id: messageId,\n messageParams,\n securityAlertResponse: req?.securityAlertResponse,\n status: 'unapproved',\n time: Date.now(),\n type,\n };\n }\n\n /**\n * Saves the unapproved messages, and their count to state.\n *\n * @param emitUpdateBadge - Whether to emit the updateBadge event.\n */\n protected saveMessageList(emitUpdateBadge = true) {\n const unapprovedMessages = this.getUnapprovedMessages();\n const unapprovedMessagesCount = this.getUnapprovedMessagesCount();\n this.update({ unapprovedMessages, unapprovedMessagesCount });\n if (emitUpdateBadge) {\n this.hub.emit('updateBadge');\n }\n }\n\n /**\n * Updates the status of a Message in this.messages.\n *\n * @param messageId - The id of the Message to update.\n * @param status - The new status of the Message.\n */\n protected setMessageStatus(messageId: string, status: string) {\n const message = this.getMessage(messageId);\n if (!message) {\n throw new Error(`${this.name}: Message not found for id: ${messageId}.`);\n }\n message.status = status;\n this.updateMessage(message);\n this.hub.emit(`${messageId}:${status}`, message);\n if (\n status === 'rejected' ||\n status === 'signed' ||\n status === 'errored' ||\n this.additionalFinishStatuses.includes(status)\n ) {\n this.hub.emit(`${messageId}:finished`, message);\n }\n }\n\n /**\n * Sets a Message in this.messages to the passed Message if the ids are equal.\n * Then saves the unapprovedMessage list to storage.\n *\n * @param message - A Message that will replace an existing Message (with the id) in this.messages.\n * @param emitUpdateBadge - Whether to emit the updateBadge event.\n */\n protected updateMessage(message: M, emitUpdateBadge = true) {\n const index = this.messages.findIndex((msg) => message.id === msg.id);\n /* istanbul ignore next */\n if (index !== -1) {\n this.messages[index] = message;\n }\n this.saveMessageList(emitUpdateBadge);\n }\n\n /**\n * Verifies a message is malicious or not by checking it against a security provider.\n *\n * @param message - The message to verify.\n * @returns A promise that resolves to a secured message with additional security provider response data.\n */\n private async securityCheck(message: M): Promise<M> {\n if (this.securityProviderRequest) {\n const securityProviderResponse = await this.securityProviderRequest(\n message,\n message.type,\n );\n return {\n ...message,\n securityProviderResponse,\n };\n }\n return message;\n }\n\n /**\n * EventEmitter instance used to listen to specific message events\n */\n hub: EventEmitter = new EventEmitter();\n\n /**\n * Name of this controller used during composition\n */\n override name = 'AbstractMessageManager';\n\n /**\n * Creates an AbstractMessageManager instance.\n *\n * @param config - Initial options used to configure this controller.\n * @param state - Initial state to set on this controller.\n * @param securityProviderRequest - A function for verifying a message, whether it is malicious or not.\n * @param additionalFinishStatuses - Optional list of statuses that are accepted to emit a finished event.\n * @param getCurrentChainId - Optional function to get the current chainId.\n */\n constructor(\n config?: Partial<BaseConfig>,\n state?: Partial<MessageManagerState<M>>,\n securityProviderRequest?: SecurityProviderRequest,\n additionalFinishStatuses?: string[],\n getCurrentChainId?: getCurrentChainId,\n ) {\n super(config, state);\n this.defaultState = {\n unapprovedMessages: {},\n unapprovedMessagesCount: 0,\n };\n this.messages = [];\n this.securityProviderRequest = securityProviderRequest;\n this.additionalFinishStatuses = additionalFinishStatuses ?? [];\n this.getCurrentChainId = getCurrentChainId;\n this.initialize();\n }\n\n /**\n * A getter for the number of 'unapproved' Messages in this.messages.\n *\n * @returns The number of 'unapproved' Messages in this.messages.\n */\n getUnapprovedMessagesCount() {\n return Object.keys(this.getUnapprovedMessages()).length;\n }\n\n /**\n * A getter for the 'unapproved' Messages in state messages.\n *\n * @returns An index of Message ids to Messages, for all 'unapproved' Messages in this.messages.\n */\n getUnapprovedMessages() {\n return this.messages\n .filter((message) => message.status === 'unapproved')\n .reduce((result: { [key: string]: M }, message: M) => {\n result[message.id] = message;\n return result;\n }, {}) as { [key: string]: M };\n }\n\n /**\n * Adds a passed Message to this.messages, and calls this.saveMessageList() to save\n * the unapproved Messages from that list to this.messages.\n *\n * @param message - The Message to add to this.messages.\n */\n async addMessage(message: M) {\n const securedMessage = await this.securityCheck(message);\n this.messages.push(securedMessage);\n this.saveMessageList();\n }\n\n /**\n * Returns a specified Message.\n *\n * @param messageId - The id of the Message to get.\n * @returns The Message with the id that matches the passed messageId, or undefined\n * if no Message has that id.\n */\n getMessage(messageId: string) {\n return this.messages.find((message) => message.id === messageId);\n }\n\n /**\n * Returns all the messages.\n *\n * @returns An array of messages.\n */\n getAllMessages() {\n return this.messages;\n }\n\n /**\n * Approves a Message. Sets the message status via a call to this.setMessageStatusApproved,\n * and returns a promise with any the message params modified for proper signing.\n *\n * @param messageParams - The messageParams to be used when signing method is called,\n * plus data added by MetaMask.\n * @returns Promise resolving to the messageParams with the metamaskId property removed.\n */\n approveMessage(messageParams: PM): Promise<P> {\n // eslint-disable-next-line @typescript-eslint/ban-ts-comment\n // @ts-ignore\n this.setMessageStatusApproved(messageParams.metamaskId);\n return this.prepMessageForSigning(messageParams);\n }\n\n /**\n * Sets a Message status to 'approved' via a call to this.setMessageStatus.\n *\n * @param messageId - The id of the Message to approve.\n */\n setMessageStatusApproved(messageId: string) {\n this.setMessageStatus(messageId, 'approved');\n }\n\n /**\n * Sets message status to inProgress in order to allow users to use extension\n * while waiting for a custodian signature.\n *\n * @param messageId - The id of the message to set to inProgress\n */\n setMessageStatusInProgress(messageId: string) {\n this.setMessageStatus(messageId, 'inProgress');\n }\n\n /**\n * Sets a Message status to 'signed' via a call to this.setMessageStatus and updates\n * that Message in this.messages by adding the raw signature data of the signature\n * request to the Message.\n *\n * @param messageId - The id of the Message to sign.\n * @param rawSig - The raw data of the signature request.\n */\n setMessageStatusSigned(messageId: string, rawSig: string) {\n this.setMessageStatusAndResult(messageId, rawSig, 'signed');\n }\n\n /**\n * Sets the message via a call to this.setResult and updates status of the message.\n *\n * @param messageId - The id of the Message to sign.\n * @param rawSig - The data to update rawSig in the message.\n * @param status - The new message status.\n */\n setMessageStatusAndResult(messageId: string, rawSig: string, status: string) {\n this.setResult(messageId, rawSig);\n this.setMessageStatus(messageId, status);\n }\n\n /**\n * Sets the message result.\n *\n * @param messageId - The id of the Message to sign.\n * @param result - The data to update result in the message.\n */\n setResult(messageId: string, result: string) {\n const message = this.getMessage(messageId);\n /* istanbul ignore if */\n if (!message) {\n return;\n }\n message.rawSig = result;\n this.updateMessage(message, false);\n }\n\n /**\n * Sets the messsage metadata\n *\n * @param messageId - The id of the Message to update\n * @param metadata - The data with which to replace the metadata property in the message\n */\n\n setMetadata(messageId: string, metadata: Json) {\n const message = this.getMessage(messageId);\n if (!message) {\n throw new Error(`${this.name}: Message not found for id: ${messageId}.`);\n }\n message.metadata = metadata;\n this.updateMessage(message, false);\n }\n\n /**\n * Removes the metamaskId property from passed messageParams and returns a promise which\n * resolves the updated messageParams\n *\n * @param messageParams - The messageParams to modify\n * @returns Promise resolving to the messageParams with the metamaskId property removed\n */\n abstract prepMessageForSigning(messageParams: PM): Promise<P>;\n\n /**\n * Creates a new Message with an 'unapproved' status using the passed messageParams.\n * this.addMessage is called to add the new Message to this.messages, and to save the\n * unapproved Messages.\n *\n * @param messageParams - Message parameters for the message to add\n * @param req - The original request object possibly containing the origin.\n * @param version? - The version of the JSON RPC protocol the request is using.\n * @returns The id of the newly created message.\n */\n abstract addUnapprovedMessage(\n messageParams: PM,\n request: OriginalRequest,\n version?: string,\n ): Promise<string>;\n\n /**\n * Sets a Message status to 'rejected' via a call to this.setMessageStatus.\n *\n * @param messageId - The id of the Message to reject.\n */\n rejectMessage(messageId: string) {\n this.setMessageStatus(messageId, 'rejected');\n }\n\n /**\n * Creates a promise which will resolve or reject when the message process is finished.\n *\n * @param messageParamsWithId - The params for the personal_sign call to be made after the message is approved.\n * @param messageName - The name of the message\n * @returns Promise resolving to the raw data of the signature request.\n */\n async waitForFinishStatus(\n messageParamsWithId: AbstractMessageParamsMetamask,\n messageName: string,\n ): Promise<string> {\n const { metamaskId: messageId, ...messageParams } = messageParamsWithId;\n return new Promise((resolve, reject) => {\n // TODO: Either fix this lint violation or explain why it's necessary to ignore.\n // eslint-disable-next-line @typescript-eslint/restrict-template-expressions\n this.hub.once(`${messageId}:finished`, (data: AbstractMessage) => {\n switch (data.status) {\n case 'signed':\n return resolve(data.rawSig as string);\n case 'rejected':\n return reject(\n new Error(\n `MetaMask ${messageName} Signature: User denied message signature.`,\n ),\n );\n case 'errored':\n return reject(\n // TODO: Either fix this lint violation or explain why it's necessary to ignore.\n // eslint-disable-next-line @typescript-eslint/restrict-template-expressions\n new Error(`MetaMask ${messageName} Signature: ${data.error}`),\n );\n default:\n return reject(\n new Error(\n `MetaMask ${messageName} Signature: Unknown problem: ${JSON.stringify(\n messageParams,\n )}`,\n ),\n );\n }\n });\n });\n }\n}\n\nexport default AbstractMessageManager;\n"]}
1
+ {"version":3,"file":"AbstractMessageManager.mjs","sourceRoot":"","sources":["../src/AbstractMessageManager.ts"],"names":[],"mappings":"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","sourcesContent":["import { BaseController } from '@metamask/base-controller';\nimport type {\n ActionConstraint,\n EventConstraint,\n RestrictedControllerMessenger,\n} from '@metamask/base-controller';\nimport type { ApprovalType } from '@metamask/controller-utils';\nimport type { Json } from '@metamask/utils';\n// This package purposefully relies on Node's EventEmitter module.\n// eslint-disable-next-line import-x/no-nodejs-modules\nimport { EventEmitter } from 'events';\nimport type { Draft } from 'immer';\nimport { v1 as random } from 'uuid';\n\nconst stateMetadata = {\n unapprovedMessages: { persist: false, anonymous: false },\n unapprovedMessagesCount: { persist: false, anonymous: false },\n};\n\nconst getDefaultState = () => ({\n unapprovedMessages: {},\n unapprovedMessagesCount: 0,\n});\n\n/**\n * @type OriginalRequest\n *\n * Represents the original request object for adding a message.\n * @property origin? - Is it is specified, represents the origin\n */\nexport type OriginalRequest = {\n id?: number;\n origin?: string;\n securityAlertResponse?: Record<string, Json>;\n};\n\n/**\n * @type AbstractMessage\n *\n * Represents and contains data about a signing type signature request.\n * @property id - An id to track and identify the message object\n * @property type - The json-prc signing method for which a signature request has been made.\n * A 'Message' which always has a signing type\n * @property rawSig - Raw data of the signature request\n * @property securityProviderResponse - Response from a security provider, whether it is malicious or not\n * @property metadata - Additional data for the message, for example external identifiers\n */\nexport type AbstractMessage = {\n id: string;\n time: number;\n status: string;\n type: string;\n rawSig?: string;\n securityProviderResponse?: Record<string, Json>;\n securityAlertResponse?: Record<string, Json>;\n metadata?: Json;\n error?: string;\n};\n\n/**\n * @type AbstractMessageParams\n *\n * Represents the parameters to pass to the signing method once the signature request is approved.\n * @property from - Address from which the message is processed\n * @property origin? - Added for request origin identification\n * @property requestId? - Original request id\n * @property deferSetAsSigned? - Whether to defer setting the message as signed immediately after the keyring is told to sign it\n */\nexport type AbstractMessageParams = {\n from: string;\n origin?: string;\n requestId?: number;\n deferSetAsSigned?: boolean;\n};\n\n/**\n * @type MessageParamsMetamask\n *\n * Represents the parameters to pass to the signing method once the signature request is approved\n * plus data added by MetaMask.\n * @property metamaskId - Added for tracking and identification within MetaMask\n * @property from - Address from which the message is processed\n * @property origin? - Added for request origin identification\n */\nexport type AbstractMessageParamsMetamask = AbstractMessageParams & {\n metamaskId?: string;\n};\n\n/**\n * @type MessageManagerState\n *\n * Message Manager state\n * @property unapprovedMessages - A collection of all Messages in the 'unapproved' state\n * @property unapprovedMessagesCount - The count of all Messages in this.unapprovedMessages\n */\nexport type MessageManagerState<Message extends AbstractMessage> = {\n unapprovedMessages: Record<string, Message>;\n unapprovedMessagesCount: number;\n};\n\nexport type UpdateBadgeEvent = {\n type: `${string}:updateBadge`;\n payload: [];\n};\n\n/**\n * A function for verifying a message, whether it is malicious or not\n */\nexport type SecurityProviderRequest = (\n requestData: AbstractMessage,\n messageType: string,\n) => Promise<Json>;\n\n/**\n * AbstractMessageManager constructor options.\n *\n * @property additionalFinishStatuses - Optional list of statuses that are accepted to emit a finished event.\n * @property messenger - Controller messaging system.\n * @property name - The name of the manager.\n * @property securityProviderRequest - A function for verifying a message, whether it is malicious or not.\n * @property state - Initial state to set on this controller.\n */\nexport type AbstractMessageManagerOptions<\n Message extends AbstractMessage,\n Action extends ActionConstraint,\n Event extends EventConstraint,\n> = {\n additionalFinishStatuses?: string[];\n messenger: RestrictedControllerMessenger<\n string,\n Action,\n Event | UpdateBadgeEvent,\n string,\n string\n >;\n name: string;\n securityProviderRequest?: SecurityProviderRequest;\n state?: MessageManagerState<Message>;\n};\n\n/**\n * Controller in charge of managing - storing, adding, removing, updating - Messages.\n */\nexport abstract class AbstractMessageManager<\n Message extends AbstractMessage,\n Params extends AbstractMessageParams,\n ParamsMetamask extends AbstractMessageParamsMetamask,\n Action extends ActionConstraint,\n Event extends EventConstraint,\n> extends BaseController<\n string,\n MessageManagerState<Message>,\n RestrictedControllerMessenger<\n string,\n Action,\n Event | UpdateBadgeEvent,\n string,\n string\n >\n> {\n protected messages: Message[];\n\n private readonly securityProviderRequest: SecurityProviderRequest | undefined;\n\n private readonly additionalFinishStatuses: string[];\n\n internalEvents = new EventEmitter();\n\n constructor({\n additionalFinishStatuses,\n messenger,\n name,\n securityProviderRequest,\n state = {} as MessageManagerState<Message>,\n }: AbstractMessageManagerOptions<Message, Action, Event>) {\n super({\n messenger,\n metadata: stateMetadata,\n name,\n state: {\n ...getDefaultState(),\n ...state,\n },\n });\n this.messages = [];\n this.securityProviderRequest = securityProviderRequest;\n this.additionalFinishStatuses = additionalFinishStatuses ?? [];\n }\n\n /**\n * Adds request props to the messsage params and returns a new messageParams object.\n * @param messageParams - The messageParams to add the request props to.\n * @param req - The original request object.\n * @returns The messageParams with the request props added.\n */\n protected addRequestToMessageParams<\n MessageParams extends AbstractMessageParams,\n >(messageParams: MessageParams, req?: OriginalRequest) {\n const updatedMessageParams = {\n ...messageParams,\n };\n\n if (req) {\n updatedMessageParams.requestId = req.id;\n updatedMessageParams.origin = req.origin;\n }\n\n return updatedMessageParams;\n }\n\n /**\n * Creates a new Message with a random id and an 'unapproved' status.\n * @param messageParams - The messageParams to add the request props to.\n * @param type - The approval type of the message.\n * @param req - The original request object.\n * @returns The new unapproved message for a specified type.\n */\n protected createUnapprovedMessage<\n MessageParams extends AbstractMessageParams,\n >(messageParams: MessageParams, type: ApprovalType, req?: OriginalRequest) {\n const messageId = random();\n\n return {\n id: messageId,\n messageParams,\n securityAlertResponse: req?.securityAlertResponse,\n status: 'unapproved',\n time: Date.now(),\n type,\n };\n }\n\n /**\n * Saves the unapproved messages, and their count to state.\n *\n * @param emitUpdateBadge - Whether to emit the updateBadge event.\n */\n protected saveMessageList(emitUpdateBadge = true) {\n this.update((state) => {\n state.unapprovedMessages =\n this.getUnapprovedMessages() as unknown as Record<\n string,\n Draft<Message>\n >;\n state.unapprovedMessagesCount = this.getUnapprovedMessagesCount();\n });\n if (emitUpdateBadge) {\n this.messagingSystem.publish(`${this.name as string}:updateBadge`);\n }\n }\n\n /**\n * Updates the status of a Message in this.messages.\n *\n * @param messageId - The id of the Message to update.\n * @param status - The new status of the Message.\n */\n protected setMessageStatus(messageId: string, status: string) {\n const message = this.getMessage(messageId);\n if (!message) {\n throw new Error(\n `${this.name as string}: Message not found for id: ${messageId}.`,\n );\n }\n const updatedMessage = {\n ...message,\n status,\n };\n this.updateMessage(updatedMessage);\n this.internalEvents.emit(`${messageId}:${status}`, updatedMessage);\n if (\n status === 'rejected' ||\n status === 'signed' ||\n status === 'errored' ||\n this.additionalFinishStatuses.includes(status)\n ) {\n this.internalEvents.emit(\n `${messageId as string}:finished`,\n updatedMessage,\n );\n }\n }\n\n /**\n * Sets a Message in this.messages to the passed Message if the ids are equal.\n * Then saves the unapprovedMessage list to storage.\n *\n * @param message - A Message that will replace an existing Message (with the id) in this.messages.\n * @param emitUpdateBadge - Whether to emit the updateBadge event.\n */\n protected updateMessage(message: Message, emitUpdateBadge = true) {\n const index = this.messages.findIndex((msg) => message.id === msg.id);\n /* istanbul ignore next */\n if (index !== -1) {\n this.messages[index] = message;\n }\n this.saveMessageList(emitUpdateBadge);\n }\n\n /**\n * Verifies a message is malicious or not by checking it against a security provider.\n *\n * @param message - The message to verify.\n * @returns A promise that resolves to a secured message with additional security provider response data.\n */\n private async securityCheck(message: Message): Promise<Message> {\n if (this.securityProviderRequest) {\n const securityProviderResponse = await this.securityProviderRequest(\n message,\n message.type,\n );\n return {\n ...message,\n securityProviderResponse,\n };\n }\n return message;\n }\n\n clearUnapprovedMessages() {\n this.update((state) => {\n state.unapprovedMessages = {};\n state.unapprovedMessagesCount = 0;\n });\n }\n\n /**\n * A getter for the number of 'unapproved' Messages in this.messages.\n *\n * @returns The number of 'unapproved' Messages in this.messages.\n */\n getUnapprovedMessagesCount() {\n return Object.keys(this.getUnapprovedMessages()).length;\n }\n\n /**\n * A getter for the 'unapproved' Messages in state messages.\n *\n * @returns An index of Message ids to Messages, for all 'unapproved' Messages in this.messages.\n */\n getUnapprovedMessages() {\n return this.messages\n .filter((message) => message.status === 'unapproved')\n .reduce((result: Record<string, Message>, message) => {\n result[message.id] = message;\n return result;\n }, {});\n }\n\n /**\n * Adds a passed Message to this.messages, and calls this.saveMessageList() to save\n * the unapproved Messages from that list to this.messages.\n *\n * @param message - The Message to add to this.messages.\n */\n async addMessage(message: Message) {\n const securedMessage = await this.securityCheck(message);\n this.messages.push(securedMessage);\n this.saveMessageList();\n }\n\n /**\n * Returns a specified Message.\n *\n * @param messageId - The id of the Message to get.\n * @returns The Message with the id that matches the passed messageId, or undefined\n * if no Message has that id.\n */\n getMessage(messageId: string) {\n return this.messages.find((message) => message.id === messageId);\n }\n\n /**\n * Returns all the messages.\n *\n * @returns An array of messages.\n */\n getAllMessages() {\n return this.messages;\n }\n\n /**\n * Approves a Message. Sets the message status via a call to this.setMessageStatusApproved,\n * and returns a promise with any the message params modified for proper signing.\n *\n * @param messageParams - The messageParams to be used when signing method is called,\n * plus data added by MetaMask.\n * @returns Promise resolving to the messageParams with the metamaskId property removed.\n */\n approveMessage(messageParams: ParamsMetamask): Promise<Params> {\n // eslint-disable-next-line @typescript-eslint/ban-ts-comment\n // @ts-ignore\n this.setMessageStatusApproved(messageParams.metamaskId);\n return this.prepMessageForSigning(messageParams);\n }\n\n /**\n * Sets a Message status to 'approved' via a call to this.setMessageStatus.\n *\n * @param messageId - The id of the Message to approve.\n */\n setMessageStatusApproved(messageId: string) {\n this.setMessageStatus(messageId, 'approved');\n }\n\n /**\n * Sets message status to inProgress in order to allow users to use extension\n * while waiting for a custodian signature.\n *\n * @param messageId - The id of the message to set to inProgress\n */\n setMessageStatusInProgress(messageId: string) {\n this.setMessageStatus(messageId, 'inProgress');\n }\n\n /**\n * Sets a Message status to 'signed' via a call to this.setMessageStatus and updates\n * that Message in this.messages by adding the raw signature data of the signature\n * request to the Message.\n *\n * @param messageId - The id of the Message to sign.\n * @param rawSig - The raw data of the signature request.\n */\n setMessageStatusSigned(messageId: string, rawSig: string) {\n this.setMessageStatusAndResult(messageId, rawSig, 'signed');\n }\n\n /**\n * Sets the message via a call to this.setResult and updates status of the message.\n *\n * @param messageId - The id of the Message to sign.\n * @param rawSig - The data to update rawSig in the message.\n * @param status - The new message status.\n */\n setMessageStatusAndResult(messageId: string, rawSig: string, status: string) {\n this.setResult(messageId, rawSig);\n this.setMessageStatus(messageId, status);\n }\n\n /**\n * Sets the message result.\n *\n * @param messageId - The id of the Message to sign.\n * @param result - The data to update result in the message.\n */\n setResult(messageId: string, result: string) {\n const message = this.getMessage(messageId);\n /* istanbul ignore if */\n if (!message) {\n return;\n }\n this.updateMessage(\n {\n ...message,\n rawSig: result,\n },\n false,\n );\n }\n\n /**\n * Sets the messsage metadata\n *\n * @param messageId - The id of the Message to update\n * @param metadata - The data with which to replace the metadata property in the message\n */\n setMetadata(messageId: string, metadata: Json) {\n const message = this.getMessage(messageId);\n if (!message) {\n throw new Error(\n `${this.name as string}: Message not found for id: ${messageId}.`,\n );\n }\n this.updateMessage(\n {\n ...message,\n metadata,\n },\n false,\n );\n }\n\n /**\n * Removes the metamaskId property from passed messageParams and returns a promise which\n * resolves the updated messageParams\n *\n * @param messageParams - The messageParams to modify\n * @returns Promise resolving to the messageParams with the metamaskId property removed\n */\n abstract prepMessageForSigning(\n messageParams: ParamsMetamask,\n ): Promise<Params>;\n\n /**\n * Creates a new Message with an 'unapproved' status using the passed messageParams.\n * this.addMessage is called to add the new Message to this.messages, and to save the\n * unapproved Messages.\n *\n * @param messageParams - Message parameters for the message to add\n * @param req - The original request object possibly containing the origin.\n * @param version? - The version of the JSON RPC protocol the request is using.\n * @returns The id of the newly created message.\n */\n abstract addUnapprovedMessage(\n messageParams: ParamsMetamask,\n request: OriginalRequest,\n version?: string,\n ): Promise<string>;\n\n /**\n * Sets a Message status to 'rejected' via a call to this.setMessageStatus.\n *\n * @param messageId - The id of the Message to reject.\n */\n rejectMessage(messageId: string) {\n this.setMessageStatus(messageId, 'rejected');\n }\n\n /**\n * Creates a promise which will resolve or reject when the message process is finished.\n *\n * @param messageParamsWithId - The params for the personal_sign call to be made after the message is approved.\n * @param messageName - The name of the message\n * @returns Promise resolving to the raw data of the signature request.\n */\n async waitForFinishStatus(\n messageParamsWithId: AbstractMessageParamsMetamask,\n messageName: string,\n ): Promise<string> {\n const { metamaskId: messageId, ...messageParams } = messageParamsWithId;\n return new Promise((resolve, reject) => {\n this.internalEvents.once(\n `${messageId as string}:finished`,\n (data: AbstractMessage) => {\n switch (data.status) {\n case 'signed':\n return resolve(data.rawSig as string);\n case 'rejected':\n return reject(\n new Error(\n `MetaMask ${messageName} Signature: User denied message signature.`,\n ),\n );\n case 'errored':\n return reject(\n new Error(\n `MetaMask ${messageName} Signature: ${data.error as string}`,\n ),\n );\n default:\n return reject(\n new Error(\n `MetaMask ${messageName} Signature: Unknown problem: ${JSON.stringify(\n messageParams,\n )}`,\n ),\n );\n }\n },\n );\n });\n }\n}\n\nexport default AbstractMessageManager;\n"]}
@@ -4,16 +4,19 @@ exports.DecryptMessageManager = void 0;
4
4
  const controller_utils_1 = require("@metamask/controller-utils");
5
5
  const AbstractMessageManager_1 = require("./AbstractMessageManager.cjs");
6
6
  const utils_1 = require("./utils.cjs");
7
+ const managerName = 'DecryptMessageManager';
7
8
  /**
8
9
  * Controller in charge of managing - storing, adding, removing, updating - DecryptMessages.
9
10
  */
10
11
  class DecryptMessageManager extends AbstractMessageManager_1.AbstractMessageManager {
11
- constructor() {
12
- super(...arguments);
13
- /**
14
- * Name of this controller used during composition
15
- */
16
- this.name = 'DecryptMessageManager';
12
+ constructor({ additionalFinishStatuses, messenger, securityProviderRequest, state, }) {
13
+ super({
14
+ additionalFinishStatuses,
15
+ messenger,
16
+ name: managerName,
17
+ securityProviderRequest,
18
+ state,
19
+ });
17
20
  }
18
21
  /**
19
22
  * Creates a new Message with an 'unapproved' status using the passed messageParams.
@@ -27,7 +30,7 @@ class DecryptMessageManager extends AbstractMessageManager_1.AbstractMessageMana
27
30
  (0, utils_1.validateDecryptedMessageData)(messageParams);
28
31
  const messageId = await this.addUnapprovedMessage(messageParams, req);
29
32
  return new Promise((resolve, reject) => {
30
- this.hub.once(`${messageId}:finished`, (data) => {
33
+ this.internalEvents.once(`${messageId}:finished`, (data) => {
31
34
  switch (data.status) {
32
35
  case 'decrypted':
33
36
  return resolve(data.rawSig);
@@ -57,7 +60,7 @@ class DecryptMessageManager extends AbstractMessageManager_1.AbstractMessageMana
57
60
  const messageData = this.createUnapprovedMessage(updatedMessageParams, controller_utils_1.ApprovalType.EthDecrypt, req);
58
61
  const messageId = messageData.id;
59
62
  await this.addMessage(messageData);
60
- this.hub.emit(`unapprovedMessage`, {
63
+ this.messagingSystem.publish(`${managerName}:unapprovedMessage`, {
61
64
  ...updatedMessageParams,
62
65
  metamaskId: messageId,
63
66
  });
@@ -1 +1 @@
1
- {"version":3,"file":"DecryptMessageManager.cjs","sourceRoot":"","sources":["../src/DecryptMessageManager.ts"],"names":[],"mappings":";;;AAAA,iEAA0D;AAQ1D,yEAAkE;AAClE,uCAA6E;AAkD7E;;GAEG;AACH,MAAa,qBAAsB,SAAQ,+CAI1C;IAJD;;QAKE;;WAEG;QACM,SAAI,GAAG,uBAAgC,CAAC;IAgGnD,CAAC;IA9FC;;;;;;;OAOG;IACH,KAAK,CAAC,yBAAyB,CAC7B,aAAmC,EACnC,GAAqB;QAErB,IAAA,oCAA4B,EAAC,aAAa,CAAC,CAAC;QAC5C,MAAM,SAAS,GAAG,MAAM,IAAI,CAAC,oBAAoB,CAAC,aAAa,EAAE,GAAG,CAAC,CAAC;QAEtE,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;YACrC,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,GAAG,SAAS,WAAW,EAAE,CAAC,IAAoB,EAAE,EAAE;gBAC9D,QAAQ,IAAI,CAAC,MAAM,EAAE;oBACnB,KAAK,WAAW;wBACd,OAAO,OAAO,CAAC,IAAI,CAAC,MAAgB,CAAC,CAAC;oBACxC,KAAK,UAAU;wBACb,OAAO,MAAM,CACX,IAAI,KAAK,CACP,0DAA0D,CAC3D,CACF,CAAC;oBACJ,KAAK,SAAS;wBACZ,OAAO,MAAM,CACX,IAAI,KAAK,CACP,4DAA4D,CAC7D,CACF,CAAC;oBACJ;wBACE,OAAO,MAAM,CACX,IAAI,KAAK,CACP,6CAA6C,IAAI,CAAC,SAAS,CACzD,aAAa,CACd,EAAE,CACJ,CACF,CAAC;iBACL;YACH,CAAC,CAAC,CAAC;QACL,CAAC,CAAC,CAAC;IACL,CAAC;IAED;;;;;;;;;OASG;IACH,KAAK,CAAC,oBAAoB,CACxB,aAAmC,EACnC,GAAqB;QAErB,MAAM,oBAAoB,GAAG,IAAI,CAAC,yBAAyB,CACzD,aAAa,EACb,GAAG,CAC2B,CAAC;QACjC,aAAa,CAAC,IAAI,GAAG,IAAA,4BAAoB,EAAC,aAAa,CAAC,IAAI,CAAC,CAAC;QAE9D,MAAM,WAAW,GAAG,IAAI,CAAC,uBAAuB,CAC9C,oBAAoB,EACpB,+BAAY,CAAC,UAAU,EACvB,GAAG,CACqB,CAAC;QAE3B,MAAM,SAAS,GAAG,WAAW,CAAC,EAAE,CAAC;QAEjC,MAAM,IAAI,CAAC,UAAU,CAAC,WAAW,CAAC,CAAC;QACnC,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,mBAAmB,EAAE;YACjC,GAAG,oBAAoB;YACvB,UAAU,EAAE,SAAS;SACtB,CAAC,CAAC;QACH,OAAO,SAAS,CAAC;IACnB,CAAC;IAED;;;;;;OAMG;IACH,qBAAqB,CACnB,aAA2C;QAE3C,OAAO,aAAa,CAAC,UAAU,CAAC;QAChC,OAAO,OAAO,CAAC,OAAO,CAAC,aAAa,CAAC,CAAC;IACxC,CAAC;CACF;AAxGD,sDAwGC","sourcesContent":["import { ApprovalType } from '@metamask/controller-utils';\n\nimport type {\n AbstractMessage,\n AbstractMessageParams,\n AbstractMessageParamsMetamask,\n OriginalRequest,\n} from './AbstractMessageManager';\nimport { AbstractMessageManager } from './AbstractMessageManager';\nimport { normalizeMessageData, validateDecryptedMessageData } from './utils';\n\n/**\n * @type DecryptMessage\n *\n * Represents and contains data about a 'eth_decrypt' type signature request.\n * These are created when a signature for an eth_decrypt call is requested.\n * @property id - An id to track and identify the message object\n * @property messageParams - The parameters to pass to the eth_decrypt method once the request is approved\n * @property type - The json-prc signing method for which a signature request has been made.\n * A 'DecryptMessage' which always has a 'eth_decrypt' type\n */\n// This interface was created before this ESLint rule was added.\n// Convert to a `type` in a future major version.\n// eslint-disable-next-line @typescript-eslint/consistent-type-definitions\nexport interface DecryptMessage extends AbstractMessage {\n messageParams: DecryptMessageParams;\n}\n\n/**\n * @type DecryptMessageParams\n *\n * Represents the parameters to pass to the eth_decrypt method once the request is approved.\n * @property data - A hex string conversion of the raw buffer data of the signature request\n */\n// This interface was created before this ESLint rule was added.\n// Convert to a `type` in a future major version.\n// eslint-disable-next-line @typescript-eslint/consistent-type-definitions\nexport interface DecryptMessageParams extends AbstractMessageParams {\n data: string;\n}\n\n/**\n * @type DecryptMessageParamsMetamask\n *\n * Represents the parameters to pass to the eth_decrypt method once the request is approved\n * plus data added by MetaMask.\n * @property metamaskId - Added for tracking and identification within MetaMask\n * @property data - A hex string conversion of the raw buffer data of the signature request\n * @property from - Address to sign this message from\n * @property origin? - Added for request origin identification\n */\n// This interface was created before this ESLint rule was added.\n// Convert to a `type` in a future major version.\n// eslint-disable-next-line @typescript-eslint/consistent-type-definitions\nexport interface DecryptMessageParamsMetamask\n extends AbstractMessageParamsMetamask {\n data: string;\n}\n\n/**\n * Controller in charge of managing - storing, adding, removing, updating - DecryptMessages.\n */\nexport class DecryptMessageManager extends AbstractMessageManager<\n DecryptMessage,\n DecryptMessageParams,\n DecryptMessageParamsMetamask\n> {\n /**\n * Name of this controller used during composition\n */\n override name = 'DecryptMessageManager' as const;\n\n /**\n * Creates a new Message with an 'unapproved' status using the passed messageParams.\n * this.addMessage is called to add the new Message to this.messages, and to save the unapproved Messages.\n *\n * @param messageParams - The params for the personal_sign call to be made after the message is approved.\n * @param req - The original request object possibly containing the origin.\n * @returns Promise resolving to the raw data of the signature request.\n */\n async addUnapprovedMessageAsync(\n messageParams: DecryptMessageParams,\n req?: OriginalRequest,\n ): Promise<string> {\n validateDecryptedMessageData(messageParams);\n const messageId = await this.addUnapprovedMessage(messageParams, req);\n\n return new Promise((resolve, reject) => {\n this.hub.once(`${messageId}:finished`, (data: DecryptMessage) => {\n switch (data.status) {\n case 'decrypted':\n return resolve(data.rawSig as string);\n case 'rejected':\n return reject(\n new Error(\n 'MetaMask DecryptMessage: User denied message decryption.',\n ),\n );\n case 'errored':\n return reject(\n new Error(\n 'MetaMask DecryptMessage: This message cannot be decrypted.',\n ),\n );\n default:\n return reject(\n new Error(\n `MetaMask DecryptMessage: Unknown problem: ${JSON.stringify(\n messageParams,\n )}`,\n ),\n );\n }\n });\n });\n }\n\n /**\n * Creates a new Message with an 'unapproved' status using the passed messageParams.\n * this.addMessage is called to add the new Message to this.messages, and to save the\n * unapproved Messages.\n *\n * @param messageParams - The params for the personal_sign call to be made after the message\n * is approved.\n * @param req - The original request object possibly containing the origin.\n * @returns The id of the newly created message.\n */\n async addUnapprovedMessage(\n messageParams: DecryptMessageParams,\n req?: OriginalRequest,\n ) {\n const updatedMessageParams = this.addRequestToMessageParams(\n messageParams,\n req,\n ) satisfies DecryptMessageParams;\n messageParams.data = normalizeMessageData(messageParams.data);\n\n const messageData = this.createUnapprovedMessage(\n updatedMessageParams,\n ApprovalType.EthDecrypt,\n req,\n ) satisfies DecryptMessage;\n\n const messageId = messageData.id;\n\n await this.addMessage(messageData);\n this.hub.emit(`unapprovedMessage`, {\n ...updatedMessageParams,\n metamaskId: messageId,\n });\n return messageId;\n }\n\n /**\n * Removes the metamaskId property from passed messageParams and returns a promise which\n * resolves the updated messageParams.\n *\n * @param messageParams - The messageParams to modify.\n * @returns Promise resolving to the messageParams with the metamaskId property removed.\n */\n prepMessageForSigning(\n messageParams: DecryptMessageParamsMetamask,\n ): Promise<DecryptMessageParams> {\n delete messageParams.metamaskId;\n return Promise.resolve(messageParams);\n }\n}\n"]}
1
+ {"version":3,"file":"DecryptMessageManager.cjs","sourceRoot":"","sources":["../src/DecryptMessageManager.ts"],"names":[],"mappings":";;;AAKA,iEAA0D;AAU1D,yEAAkE;AAClE,uCAA6E;AAE7E,MAAM,WAAW,GAAG,uBAAuB,CAAC;AAyE5C;;GAEG;AACH,MAAa,qBAAsB,SAAQ,+CAQ1C;IACC,YAAY,EACV,wBAAwB,EACxB,SAAS,EACT,uBAAuB,EACvB,KAAK,GACwB;QAC7B,KAAK,CAAC;YACJ,wBAAwB;YACxB,SAAS;YACT,IAAI,EAAE,WAAW;YACjB,uBAAuB;YACvB,KAAK;SACN,CAAC,CAAC;IACL,CAAC;IAED;;;;;;;OAOG;IACH,KAAK,CAAC,yBAAyB,CAC7B,aAAmC,EACnC,GAAqB;QAErB,IAAA,oCAA4B,EAAC,aAAa,CAAC,CAAC;QAC5C,MAAM,SAAS,GAAG,MAAM,IAAI,CAAC,oBAAoB,CAAC,aAAa,EAAE,GAAG,CAAC,CAAC;QAEtE,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;YACrC,IAAI,CAAC,cAAc,CAAC,IAAI,CACtB,GAAG,SAAS,WAAW,EACvB,CAAC,IAAoB,EAAE,EAAE;gBACvB,QAAQ,IAAI,CAAC,MAAM,EAAE;oBACnB,KAAK,WAAW;wBACd,OAAO,OAAO,CAAC,IAAI,CAAC,MAAgB,CAAC,CAAC;oBACxC,KAAK,UAAU;wBACb,OAAO,MAAM,CACX,IAAI,KAAK,CACP,0DAA0D,CAC3D,CACF,CAAC;oBACJ,KAAK,SAAS;wBACZ,OAAO,MAAM,CACX,IAAI,KAAK,CACP,4DAA4D,CAC7D,CACF,CAAC;oBACJ;wBACE,OAAO,MAAM,CACX,IAAI,KAAK,CACP,6CAA6C,IAAI,CAAC,SAAS,CACzD,aAAa,CACd,EAAE,CACJ,CACF,CAAC;iBACL;YACH,CAAC,CACF,CAAC;QACJ,CAAC,CAAC,CAAC;IACL,CAAC;IAED;;;;;;;;;OASG;IACH,KAAK,CAAC,oBAAoB,CACxB,aAAmC,EACnC,GAAqB;QAErB,MAAM,oBAAoB,GAAG,IAAI,CAAC,yBAAyB,CACzD,aAAa,EACb,GAAG,CAC2B,CAAC;QACjC,aAAa,CAAC,IAAI,GAAG,IAAA,4BAAoB,EAAC,aAAa,CAAC,IAAI,CAAC,CAAC;QAE9D,MAAM,WAAW,GAAG,IAAI,CAAC,uBAAuB,CAC9C,oBAAoB,EACpB,+BAAY,CAAC,UAAU,EACvB,GAAG,CACqB,CAAC;QAE3B,MAAM,SAAS,GAAG,WAAW,CAAC,EAAE,CAAC;QAEjC,MAAM,IAAI,CAAC,UAAU,CAAC,WAAW,CAAC,CAAC;QACnC,IAAI,CAAC,eAAe,CAAC,OAAO,CAAC,GAAG,WAAW,oBAAoB,EAAE;YAC/D,GAAG,oBAAoB;YACvB,UAAU,EAAE,SAAS;SACtB,CAAC,CAAC;QACH,OAAO,SAAS,CAAC;IACnB,CAAC;IAED;;;;;;OAMG;IACH,qBAAqB,CACnB,aAA2C;QAE3C,OAAO,aAAa,CAAC,UAAU,CAAC;QAChC,OAAO,OAAO,CAAC,OAAO,CAAC,aAAa,CAAC,CAAC;IACxC,CAAC;CACF;AAzHD,sDAyHC","sourcesContent":["import type {\n ActionConstraint,\n EventConstraint,\n RestrictedControllerMessenger,\n} from '@metamask/base-controller';\nimport { ApprovalType } from '@metamask/controller-utils';\n\nimport type {\n AbstractMessage,\n AbstractMessageParams,\n AbstractMessageParamsMetamask,\n MessageManagerState,\n OriginalRequest,\n SecurityProviderRequest,\n} from './AbstractMessageManager';\nimport { AbstractMessageManager } from './AbstractMessageManager';\nimport { normalizeMessageData, validateDecryptedMessageData } from './utils';\n\nconst managerName = 'DecryptMessageManager';\n\nexport type DecryptMessageManagerState = MessageManagerState<DecryptMessage>;\n\nexport type DecryptMessageManagerUnapprovedMessageAddedEvent = {\n type: `${typeof managerName}:unapprovedMessage`;\n payload: [AbstractMessageParamsMetamask];\n};\n\nexport type DecryptMessageManagerUpdateBadgeEvent = {\n type: `${typeof managerName}:updateBadge`;\n payload: [];\n};\n\nexport type DecryptMessageManagerMessenger = RestrictedControllerMessenger<\n string,\n ActionConstraint,\n | EventConstraint\n | DecryptMessageManagerUnapprovedMessageAddedEvent\n | DecryptMessageManagerUpdateBadgeEvent,\n string,\n string\n>;\n\ntype DecryptMessageManagerOptions = {\n messenger: DecryptMessageManagerMessenger;\n securityProviderRequest?: SecurityProviderRequest;\n state?: MessageManagerState<DecryptMessage>;\n additionalFinishStatuses?: string[];\n};\n\n/**\n * @type DecryptMessage\n *\n * Represents and contains data about a 'eth_decrypt' type signature request.\n * These are created when a signature for an eth_decrypt call is requested.\n * @property id - An id to track and identify the message object\n * @property messageParams - The parameters to pass to the eth_decrypt method once the request is approved\n * @property type - The json-prc signing method for which a signature request has been made.\n * A 'DecryptMessage' which always has a 'eth_decrypt' type\n */\nexport type DecryptMessage = AbstractMessage & {\n messageParams: DecryptMessageParams;\n};\n\n/**\n * @type DecryptMessageParams\n *\n * Represents the parameters to pass to the eth_decrypt method once the request is approved.\n * @property data - A hex string conversion of the raw buffer data of the signature request\n */\nexport type DecryptMessageParams = AbstractMessageParams & {\n data: string;\n};\n\n/**\n * @type DecryptMessageParamsMetamask\n *\n * Represents the parameters to pass to the eth_decrypt method once the request is approved\n * plus data added by MetaMask.\n * @property metamaskId - Added for tracking and identification within MetaMask\n * @property data - A hex string conversion of the raw buffer data of the signature request\n * @property from - Address to sign this message from\n * @property origin? - Added for request origin identification\n */\n// This interface was created before this ESLint rule was added.\n// Convert to a `type` in a future major version.\n// eslint-disable-next-line @typescript-eslint/consistent-type-definitions\nexport interface DecryptMessageParamsMetamask\n extends AbstractMessageParamsMetamask {\n data: string;\n}\n\n/**\n * Controller in charge of managing - storing, adding, removing, updating - DecryptMessages.\n */\nexport class DecryptMessageManager extends AbstractMessageManager<\n DecryptMessage,\n DecryptMessageParams,\n DecryptMessageParamsMetamask,\n ActionConstraint,\n | EventConstraint\n | DecryptMessageManagerUnapprovedMessageAddedEvent\n | DecryptMessageManagerUpdateBadgeEvent\n> {\n constructor({\n additionalFinishStatuses,\n messenger,\n securityProviderRequest,\n state,\n }: DecryptMessageManagerOptions) {\n super({\n additionalFinishStatuses,\n messenger,\n name: managerName,\n securityProviderRequest,\n state,\n });\n }\n\n /**\n * Creates a new Message with an 'unapproved' status using the passed messageParams.\n * this.addMessage is called to add the new Message to this.messages, and to save the unapproved Messages.\n *\n * @param messageParams - The params for the personal_sign call to be made after the message is approved.\n * @param req - The original request object possibly containing the origin.\n * @returns Promise resolving to the raw data of the signature request.\n */\n async addUnapprovedMessageAsync(\n messageParams: DecryptMessageParams,\n req?: OriginalRequest,\n ): Promise<string> {\n validateDecryptedMessageData(messageParams);\n const messageId = await this.addUnapprovedMessage(messageParams, req);\n\n return new Promise((resolve, reject) => {\n this.internalEvents.once(\n `${messageId}:finished`,\n (data: DecryptMessage) => {\n switch (data.status) {\n case 'decrypted':\n return resolve(data.rawSig as string);\n case 'rejected':\n return reject(\n new Error(\n 'MetaMask DecryptMessage: User denied message decryption.',\n ),\n );\n case 'errored':\n return reject(\n new Error(\n 'MetaMask DecryptMessage: This message cannot be decrypted.',\n ),\n );\n default:\n return reject(\n new Error(\n `MetaMask DecryptMessage: Unknown problem: ${JSON.stringify(\n messageParams,\n )}`,\n ),\n );\n }\n },\n );\n });\n }\n\n /**\n * Creates a new Message with an 'unapproved' status using the passed messageParams.\n * this.addMessage is called to add the new Message to this.messages, and to save the\n * unapproved Messages.\n *\n * @param messageParams - The params for the personal_sign call to be made after the message\n * is approved.\n * @param req - The original request object possibly containing the origin.\n * @returns The id of the newly created message.\n */\n async addUnapprovedMessage(\n messageParams: DecryptMessageParams,\n req?: OriginalRequest,\n ) {\n const updatedMessageParams = this.addRequestToMessageParams(\n messageParams,\n req,\n ) satisfies DecryptMessageParams;\n messageParams.data = normalizeMessageData(messageParams.data);\n\n const messageData = this.createUnapprovedMessage(\n updatedMessageParams,\n ApprovalType.EthDecrypt,\n req,\n ) satisfies DecryptMessage;\n\n const messageId = messageData.id;\n\n await this.addMessage(messageData);\n this.messagingSystem.publish(`${managerName}:unapprovedMessage`, {\n ...updatedMessageParams,\n metamaskId: messageId,\n });\n return messageId;\n }\n\n /**\n * Removes the metamaskId property from passed messageParams and returns a promise which\n * resolves the updated messageParams.\n *\n * @param messageParams - The messageParams to modify.\n * @returns Promise resolving to the messageParams with the metamaskId property removed.\n */\n prepMessageForSigning(\n messageParams: DecryptMessageParamsMetamask,\n ): Promise<DecryptMessageParams> {\n delete messageParams.metamaskId;\n return Promise.resolve(messageParams);\n }\n}\n"]}