@metamask/eth-ledger-bridge-keyring 11.0.1 → 11.0.2

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.
package/CHANGELOG.md CHANGED
@@ -7,6 +7,12 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
7
7
 
8
8
  ## [Unreleased]
9
9
 
10
+ ## [11.0.2]
11
+
12
+ ### Fixed
13
+
14
+ - Increase timeout for user action requests ([#275](https://github.com/MetaMask/accounts/pull/275))
15
+
10
16
  ## [11.0.1]
11
17
 
12
18
  ### Fixed
@@ -312,7 +318,8 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
312
318
 
313
319
  - Support new versions of ethereumjs/tx ([#68](https://github.com/MetaMask/eth-ledger-bridge-keyring/pull/68))
314
320
 
315
- [Unreleased]: https://github.com/MetaMask/accounts/compare/@metamask/eth-ledger-bridge-keyring@11.0.1...HEAD
321
+ [Unreleased]: https://github.com/MetaMask/accounts/compare/@metamask/eth-ledger-bridge-keyring@11.0.2...HEAD
322
+ [11.0.2]: https://github.com/MetaMask/accounts/compare/@metamask/eth-ledger-bridge-keyring@11.0.1...@metamask/eth-ledger-bridge-keyring@11.0.2
316
323
  [11.0.1]: https://github.com/MetaMask/accounts/compare/@metamask/eth-ledger-bridge-keyring@11.0.0...@metamask/eth-ledger-bridge-keyring@11.0.1
317
324
  [11.0.0]: https://github.com/MetaMask/accounts/compare/@metamask/eth-ledger-bridge-keyring@10.0.0...@metamask/eth-ledger-bridge-keyring@11.0.0
318
325
  [10.0.0]: https://github.com/MetaMask/accounts/compare/@metamask/eth-ledger-bridge-keyring@9.0.0...@metamask/eth-ledger-bridge-keyring@10.0.0
@@ -16,6 +16,7 @@ exports.LedgerIframeBridge = exports.IFrameMessageAction = void 0;
16
16
  const utils_1 = require("@metamask/utils");
17
17
  const LEDGER_IFRAME_ID = 'LEDGER-IFRAME';
18
18
  const IFRAME_MESSAGE_TIMEOUT = 4000;
19
+ const USER_ACTION_REQUEST_TIMEOUT = 20000;
19
20
  var IFrameMessageAction;
20
21
  (function (IFrameMessageAction) {
21
22
  IFrameMessageAction["LedgerIsIframeReady"] = "ledger-is-iframe-ready";
@@ -92,21 +93,21 @@ class LedgerIframeBridge {
92
93
  throw new Error('Ledger transport could not be updated');
93
94
  }
94
95
  async getPublicKey(params) {
95
- return __classPrivateFieldGet(this, _LedgerIframeBridge_instances, "m", _LedgerIframeBridge_deviceActionMessage).call(this, IFrameMessageAction.LedgerUnlock, params);
96
+ return __classPrivateFieldGet(this, _LedgerIframeBridge_instances, "m", _LedgerIframeBridge_deviceActionMessage).call(this, IFrameMessageAction.LedgerUnlock, params, USER_ACTION_REQUEST_TIMEOUT);
96
97
  }
97
98
  async deviceSignTransaction(params) {
98
- return __classPrivateFieldGet(this, _LedgerIframeBridge_instances, "m", _LedgerIframeBridge_deviceActionMessage).call(this, IFrameMessageAction.LedgerSignTransaction, params);
99
+ return __classPrivateFieldGet(this, _LedgerIframeBridge_instances, "m", _LedgerIframeBridge_deviceActionMessage).call(this, IFrameMessageAction.LedgerSignTransaction, params, USER_ACTION_REQUEST_TIMEOUT);
99
100
  }
100
101
  async deviceSignMessage(params) {
101
- return __classPrivateFieldGet(this, _LedgerIframeBridge_instances, "m", _LedgerIframeBridge_deviceActionMessage).call(this, IFrameMessageAction.LedgerSignPersonalMessage, params);
102
+ return __classPrivateFieldGet(this, _LedgerIframeBridge_instances, "m", _LedgerIframeBridge_deviceActionMessage).call(this, IFrameMessageAction.LedgerSignPersonalMessage, params, USER_ACTION_REQUEST_TIMEOUT);
102
103
  }
103
104
  async deviceSignTypedData(params) {
104
- return __classPrivateFieldGet(this, _LedgerIframeBridge_instances, "m", _LedgerIframeBridge_deviceActionMessage).call(this, IFrameMessageAction.LedgerSignTypedData, params);
105
+ return __classPrivateFieldGet(this, _LedgerIframeBridge_instances, "m", _LedgerIframeBridge_deviceActionMessage).call(this, IFrameMessageAction.LedgerSignTypedData, params, USER_ACTION_REQUEST_TIMEOUT);
105
106
  }
106
107
  }
107
108
  exports.LedgerIframeBridge = LedgerIframeBridge;
108
- _LedgerIframeBridge_opts = new WeakMap(), _LedgerIframeBridge_messageResponseHandles = new WeakMap(), _LedgerIframeBridge_instances = new WeakSet(), _LedgerIframeBridge_deviceActionMessage = async function _LedgerIframeBridge_deviceActionMessage(...[action, params]) {
109
- const response = await __classPrivateFieldGet(this, _LedgerIframeBridge_instances, "m", _LedgerIframeBridge_sendMessage).call(this, { action, params });
109
+ _LedgerIframeBridge_opts = new WeakMap(), _LedgerIframeBridge_messageResponseHandles = new WeakMap(), _LedgerIframeBridge_instances = new WeakSet(), _LedgerIframeBridge_deviceActionMessage = async function _LedgerIframeBridge_deviceActionMessage(...[action, params, timeout]) {
110
+ const response = await __classPrivateFieldGet(this, _LedgerIframeBridge_instances, "m", _LedgerIframeBridge_sendMessage).call(this, { action, params }, timeout);
110
111
  if ('payload' in response && response.payload) {
111
112
  if ('success' in response && response.success) {
112
113
  return response.payload;
@@ -146,7 +147,7 @@ _LedgerIframeBridge_opts = new WeakMap(), _LedgerIframeBridge_messageResponseHan
146
147
  this.isDeviceConnected = data.payload.connected;
147
148
  }
148
149
  }
149
- }, _LedgerIframeBridge_sendMessage = async function _LedgerIframeBridge_sendMessage(message) {
150
+ }, _LedgerIframeBridge_sendMessage = async function _LedgerIframeBridge_sendMessage(message, timeout = IFRAME_MESSAGE_TIMEOUT) {
150
151
  this.currentMessageId += 1;
151
152
  const postMsg = {
152
153
  ...message,
@@ -163,7 +164,7 @@ _LedgerIframeBridge_opts = new WeakMap(), _LedgerIframeBridge_messageResponseHan
163
164
  __classPrivateFieldGet(this, _LedgerIframeBridge_messageResponseHandles, "f").delete(postMsg.messageId);
164
165
  messageResponseHandle.reject(new Error('Ledger iframe message timeout'));
165
166
  }
166
- }, IFRAME_MESSAGE_TIMEOUT);
167
+ }, timeout);
167
168
  this.iframe.contentWindow.postMessage(postMsg, '*');
168
169
  return messageResponseHandle.promise;
169
170
  }, _LedgerIframeBridge_validateConfiguration = function _LedgerIframeBridge_validateConfiguration(opts) {
@@ -1 +1 @@
1
- {"version":3,"file":"ledger-iframe-bridge.cjs","sourceRoot":"","sources":["../src/ledger-iframe-bridge.ts"],"names":[],"mappings":"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","sourcesContent":["import { createDeferredPromise, DeferredPromise } from '@metamask/utils';\n\nimport {\n GetPublicKeyParams,\n GetPublicKeyResponse,\n LedgerBridge,\n LedgerSignMessageParams,\n LedgerSignMessageResponse,\n LedgerSignTransactionParams,\n LedgerSignTransactionResponse,\n LedgerSignTypedDataParams,\n LedgerSignTypedDataResponse,\n} from './ledger-bridge';\n\nconst LEDGER_IFRAME_ID = 'LEDGER-IFRAME';\n\nconst IFRAME_MESSAGE_TIMEOUT = 4000;\n\nexport enum IFrameMessageAction {\n LedgerIsIframeReady = 'ledger-is-iframe-ready',\n LedgerConnectionChange = 'ledger-connection-change',\n LedgerUnlock = 'ledger-unlock',\n LedgerMakeApp = 'ledger-make-app',\n LedgerUpdateTransport = 'ledger-update-transport',\n LedgerSignTransaction = 'ledger-sign-transaction',\n LedgerSignPersonalMessage = 'ledger-sign-personal-message',\n LedgerSignTypedData = 'ledger-sign-typed-data',\n}\n\ntype IFrameMessageResponseStub<\n SuccessResult extends Record<string, unknown>,\n FailureResult = Error,\n> = {\n messageId: number;\n} & (\n | { success: true; payload: SuccessResult }\n | { success: false; payload: { error: FailureResult } }\n);\n\ntype LedgerConnectionChangeActionResponse = {\n messageId: number;\n action: IFrameMessageAction.LedgerConnectionChange;\n payload: { connected: boolean };\n};\n\ntype LedgerMakeAppActionResponse = {\n messageId: number;\n action: IFrameMessageAction.LedgerMakeApp;\n} & ({ success: true } | { success: false; error?: unknown });\n\ntype LedgerUpdateTransportActionResponse = {\n messageId: number;\n action: IFrameMessageAction.LedgerUpdateTransport;\n success: boolean;\n};\n\ntype LedgerUnlockActionResponse = {\n action: IFrameMessageAction.LedgerUnlock;\n} & IFrameMessageResponseStub<GetPublicKeyResponse>;\n\ntype LedgerSignTransactionActionResponse = {\n action: IFrameMessageAction.LedgerSignTransaction;\n} & IFrameMessageResponseStub<LedgerSignTransactionResponse>;\n\ntype LedgerSignPersonalMessageActionResponse = {\n action: IFrameMessageAction.LedgerSignPersonalMessage;\n} & IFrameMessageResponseStub<LedgerSignMessageResponse>;\n\ntype LedgerSignTypedDataActionResponse = {\n action: IFrameMessageAction.LedgerSignTypedData;\n} & IFrameMessageResponseStub<LedgerSignTypedDataResponse>;\n\nexport type IFrameMessageResponse =\n | LedgerConnectionChangeActionResponse\n | LedgerMakeAppActionResponse\n | LedgerUpdateTransportActionResponse\n | LedgerUnlockActionResponse\n | LedgerSignTransactionActionResponse\n | LedgerSignPersonalMessageActionResponse\n | LedgerSignTypedDataActionResponse;\n\ntype IFrameMessage<TAction extends IFrameMessageAction> = {\n action: TAction;\n params?: Readonly<Record<string, unknown>>;\n};\n\ntype IFramePostMessage<TAction extends IFrameMessageAction> =\n IFrameMessage<TAction> & {\n messageId: number;\n target: typeof LEDGER_IFRAME_ID;\n };\n\nexport type LedgerIframeBridgeOptions = {\n bridgeUrl: string;\n};\n\nexport class LedgerIframeBridge\n implements LedgerBridge<LedgerIframeBridgeOptions>\n{\n iframe?: HTMLIFrameElement;\n\n iframeLoaded = false;\n\n readonly #opts: LedgerIframeBridgeOptions;\n\n eventListener?: (eventMessage: {\n origin: string;\n data: IFrameMessageResponse;\n }) => void;\n\n isDeviceConnected = false;\n\n currentMessageId = 0;\n\n readonly #messageResponseHandles: Map<\n number,\n DeferredPromise<IFrameMessageResponse>\n > = new Map();\n\n constructor(\n opts: LedgerIframeBridgeOptions = {\n bridgeUrl: 'https://metamask.github.io/eth-ledger-bridge-keyring',\n },\n ) {\n this.#validateConfiguration(opts);\n this.#opts = {\n bridgeUrl: opts?.bridgeUrl,\n };\n }\n\n async init(): Promise<void> {\n await this.#setupIframe(this.#opts.bridgeUrl);\n\n this.eventListener = this.#eventListener.bind(this, this.#opts.bridgeUrl);\n\n window.addEventListener('message', this.eventListener);\n }\n\n async destroy(): Promise<void> {\n if (this.eventListener) {\n window.removeEventListener('message', this.eventListener);\n }\n }\n\n async getOptions(): Promise<LedgerIframeBridgeOptions> {\n return this.#opts;\n }\n\n async setOptions(opts: LedgerIframeBridgeOptions): Promise<void> {\n this.#validateConfiguration(opts);\n if (this.#opts?.bridgeUrl !== opts.bridgeUrl) {\n this.#opts.bridgeUrl = opts.bridgeUrl;\n await this.destroy();\n await this.init();\n }\n }\n\n async attemptMakeApp(): Promise<boolean> {\n const response = await this.#sendMessage({\n action: IFrameMessageAction.LedgerMakeApp,\n });\n\n if ('success' in response && response.success) {\n return true;\n } else if ('error' in response) {\n // Assuming this is using an `Error` type:\n throw response.error;\n } else {\n throw new Error('Unknown error occurred');\n }\n }\n\n async updateTransportMethod(transportType: string): Promise<boolean> {\n if (!this.iframeLoaded) {\n throw new Error('The iframe is not loaded yet');\n }\n\n const response = await this.#sendMessage({\n action: IFrameMessageAction.LedgerUpdateTransport,\n params: { transportType },\n });\n\n if ('success' in response && response.success) {\n return true;\n }\n\n throw new Error('Ledger transport could not be updated');\n }\n\n async getPublicKey(\n params: GetPublicKeyParams,\n ): Promise<GetPublicKeyResponse> {\n return this.#deviceActionMessage(IFrameMessageAction.LedgerUnlock, params);\n }\n\n async deviceSignTransaction(\n params: LedgerSignTransactionParams,\n ): Promise<LedgerSignTransactionResponse> {\n return this.#deviceActionMessage(\n IFrameMessageAction.LedgerSignTransaction,\n params,\n );\n }\n\n async deviceSignMessage(\n params: LedgerSignMessageParams,\n ): Promise<LedgerSignMessageResponse> {\n return this.#deviceActionMessage(\n IFrameMessageAction.LedgerSignPersonalMessage,\n params,\n );\n }\n\n async deviceSignTypedData(\n params: LedgerSignTypedDataParams,\n ): Promise<LedgerSignTypedDataResponse> {\n return this.#deviceActionMessage(\n IFrameMessageAction.LedgerSignTypedData,\n params,\n );\n }\n\n async #deviceActionMessage(\n action: IFrameMessageAction.LedgerUnlock,\n params: GetPublicKeyParams,\n ): Promise<GetPublicKeyResponse>;\n\n async #deviceActionMessage(\n action: IFrameMessageAction.LedgerSignTransaction,\n params: LedgerSignTransactionParams,\n ): Promise<LedgerSignTransactionResponse>;\n\n async #deviceActionMessage(\n action: IFrameMessageAction.LedgerSignPersonalMessage,\n params: LedgerSignMessageParams,\n ): Promise<LedgerSignMessageResponse>;\n\n async #deviceActionMessage(\n action: IFrameMessageAction.LedgerSignTypedData,\n params: LedgerSignTypedDataParams,\n ): Promise<LedgerSignTypedDataResponse>;\n\n async #deviceActionMessage(\n ...[action, params]:\n | [IFrameMessageAction.LedgerUnlock, GetPublicKeyParams]\n | [IFrameMessageAction.LedgerSignTransaction, LedgerSignTransactionParams]\n | [IFrameMessageAction.LedgerSignPersonalMessage, LedgerSignMessageParams]\n | [IFrameMessageAction.LedgerSignTypedData, LedgerSignTypedDataParams]\n ): Promise<\n | GetPublicKeyResponse\n | LedgerSignTransactionResponse\n | LedgerSignMessageResponse\n | LedgerSignTypedDataResponse\n > {\n const response = await this.#sendMessage({ action, params });\n\n if ('payload' in response && response.payload) {\n if ('success' in response && response.success) {\n return response.payload;\n }\n if ('error' in response.payload) {\n throw response.payload.error;\n }\n }\n\n throw new Error('Unknown error occurred');\n }\n\n async #setupIframe(bridgeUrl: string): Promise<void> {\n return new Promise((resolve) => {\n this.iframe = document.createElement('iframe');\n this.iframe.src = bridgeUrl;\n this.iframe.allow = `hid 'src'`;\n this.iframe.onload = async (): Promise<void> => {\n this.iframeLoaded = true;\n resolve();\n };\n document.head.appendChild(this.iframe);\n });\n }\n\n #getOrigin(bridgeUrl: string): string {\n const tmp = bridgeUrl.split('/');\n tmp.splice(-1, 1);\n return tmp.join('/');\n }\n\n #eventListener(\n bridgeUrl: string,\n eventMessage: {\n origin: string;\n data: IFrameMessageResponse;\n },\n ): void {\n const { origin, data } = eventMessage;\n\n if (origin !== this.#getOrigin(bridgeUrl)) {\n return;\n }\n\n if (data) {\n const messageResponseHandle = this.#messageResponseHandles.get(\n data.messageId,\n );\n if (messageResponseHandle) {\n messageResponseHandle.resolve(data);\n this.#messageResponseHandles.delete(data.messageId);\n } else if (data.action === IFrameMessageAction.LedgerConnectionChange) {\n this.isDeviceConnected = data.payload.connected;\n }\n }\n }\n\n async #sendMessage<TAction extends IFrameMessageAction>(\n message: IFrameMessage<TAction>,\n ): Promise<IFrameMessageResponse> {\n this.currentMessageId += 1;\n\n const postMsg: IFramePostMessage<TAction> = {\n ...message,\n messageId: this.currentMessageId,\n target: LEDGER_IFRAME_ID,\n };\n\n const messageResponseHandle =\n createDeferredPromise<IFrameMessageResponse>();\n\n this.#messageResponseHandles.set(\n this.currentMessageId,\n messageResponseHandle,\n );\n\n if (!this.iframeLoaded || !this.iframe?.contentWindow) {\n throw new Error('The iframe is not loaded yet');\n }\n\n setTimeout(() => {\n if (this.#messageResponseHandles.has(postMsg.messageId)) {\n this.#messageResponseHandles.delete(postMsg.messageId);\n messageResponseHandle.reject(\n new Error('Ledger iframe message timeout'),\n );\n }\n }, IFRAME_MESSAGE_TIMEOUT);\n\n this.iframe.contentWindow.postMessage(postMsg, '*');\n\n return messageResponseHandle.promise;\n }\n\n #validateConfiguration(opts: LedgerIframeBridgeOptions): void {\n if (typeof opts.bridgeUrl !== 'string' || opts.bridgeUrl.length === 0) {\n throw new Error('bridgeURL is not a valid URL');\n }\n }\n}\n"]}
1
+ {"version":3,"file":"ledger-iframe-bridge.cjs","sourceRoot":"","sources":["../src/ledger-iframe-bridge.ts"],"names":[],"mappings":"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","sourcesContent":["import { createDeferredPromise, DeferredPromise } from '@metamask/utils';\n\nimport {\n GetPublicKeyParams,\n GetPublicKeyResponse,\n LedgerBridge,\n LedgerSignMessageParams,\n LedgerSignMessageResponse,\n LedgerSignTransactionParams,\n LedgerSignTransactionResponse,\n LedgerSignTypedDataParams,\n LedgerSignTypedDataResponse,\n} from './ledger-bridge';\n\nconst LEDGER_IFRAME_ID = 'LEDGER-IFRAME';\n\nconst IFRAME_MESSAGE_TIMEOUT = 4000;\n\nconst USER_ACTION_REQUEST_TIMEOUT = 20_000;\n\nexport enum IFrameMessageAction {\n LedgerIsIframeReady = 'ledger-is-iframe-ready',\n LedgerConnectionChange = 'ledger-connection-change',\n LedgerUnlock = 'ledger-unlock',\n LedgerMakeApp = 'ledger-make-app',\n LedgerUpdateTransport = 'ledger-update-transport',\n LedgerSignTransaction = 'ledger-sign-transaction',\n LedgerSignPersonalMessage = 'ledger-sign-personal-message',\n LedgerSignTypedData = 'ledger-sign-typed-data',\n}\n\ntype IFrameMessageResponseStub<\n SuccessResult extends Record<string, unknown>,\n FailureResult = Error,\n> = {\n messageId: number;\n} & (\n | { success: true; payload: SuccessResult }\n | { success: false; payload: { error: FailureResult } }\n);\n\ntype LedgerConnectionChangeActionResponse = {\n messageId: number;\n action: IFrameMessageAction.LedgerConnectionChange;\n payload: { connected: boolean };\n};\n\ntype LedgerMakeAppActionResponse = {\n messageId: number;\n action: IFrameMessageAction.LedgerMakeApp;\n} & ({ success: true } | { success: false; error?: unknown });\n\ntype LedgerUpdateTransportActionResponse = {\n messageId: number;\n action: IFrameMessageAction.LedgerUpdateTransport;\n success: boolean;\n};\n\ntype LedgerUnlockActionResponse = {\n action: IFrameMessageAction.LedgerUnlock;\n} & IFrameMessageResponseStub<GetPublicKeyResponse>;\n\ntype LedgerSignTransactionActionResponse = {\n action: IFrameMessageAction.LedgerSignTransaction;\n} & IFrameMessageResponseStub<LedgerSignTransactionResponse>;\n\ntype LedgerSignPersonalMessageActionResponse = {\n action: IFrameMessageAction.LedgerSignPersonalMessage;\n} & IFrameMessageResponseStub<LedgerSignMessageResponse>;\n\ntype LedgerSignTypedDataActionResponse = {\n action: IFrameMessageAction.LedgerSignTypedData;\n} & IFrameMessageResponseStub<LedgerSignTypedDataResponse>;\n\nexport type IFrameMessageResponse =\n | LedgerConnectionChangeActionResponse\n | LedgerMakeAppActionResponse\n | LedgerUpdateTransportActionResponse\n | LedgerUnlockActionResponse\n | LedgerSignTransactionActionResponse\n | LedgerSignPersonalMessageActionResponse\n | LedgerSignTypedDataActionResponse;\n\ntype IFrameMessage<TAction extends IFrameMessageAction> = {\n action: TAction;\n params?: Readonly<Record<string, unknown>>;\n};\n\ntype IFramePostMessage<TAction extends IFrameMessageAction> =\n IFrameMessage<TAction> & {\n messageId: number;\n target: typeof LEDGER_IFRAME_ID;\n };\n\nexport type LedgerIframeBridgeOptions = {\n bridgeUrl: string;\n};\n\nexport class LedgerIframeBridge\n implements LedgerBridge<LedgerIframeBridgeOptions>\n{\n iframe?: HTMLIFrameElement;\n\n iframeLoaded = false;\n\n readonly #opts: LedgerIframeBridgeOptions;\n\n eventListener?: (eventMessage: {\n origin: string;\n data: IFrameMessageResponse;\n }) => void;\n\n isDeviceConnected = false;\n\n currentMessageId = 0;\n\n readonly #messageResponseHandles: Map<\n number,\n DeferredPromise<IFrameMessageResponse>\n > = new Map();\n\n constructor(\n opts: LedgerIframeBridgeOptions = {\n bridgeUrl: 'https://metamask.github.io/eth-ledger-bridge-keyring',\n },\n ) {\n this.#validateConfiguration(opts);\n this.#opts = {\n bridgeUrl: opts?.bridgeUrl,\n };\n }\n\n async init(): Promise<void> {\n await this.#setupIframe(this.#opts.bridgeUrl);\n\n this.eventListener = this.#eventListener.bind(this, this.#opts.bridgeUrl);\n\n window.addEventListener('message', this.eventListener);\n }\n\n async destroy(): Promise<void> {\n if (this.eventListener) {\n window.removeEventListener('message', this.eventListener);\n }\n }\n\n async getOptions(): Promise<LedgerIframeBridgeOptions> {\n return this.#opts;\n }\n\n async setOptions(opts: LedgerIframeBridgeOptions): Promise<void> {\n this.#validateConfiguration(opts);\n if (this.#opts?.bridgeUrl !== opts.bridgeUrl) {\n this.#opts.bridgeUrl = opts.bridgeUrl;\n await this.destroy();\n await this.init();\n }\n }\n\n async attemptMakeApp(): Promise<boolean> {\n const response = await this.#sendMessage({\n action: IFrameMessageAction.LedgerMakeApp,\n });\n\n if ('success' in response && response.success) {\n return true;\n } else if ('error' in response) {\n // Assuming this is using an `Error` type:\n throw response.error;\n } else {\n throw new Error('Unknown error occurred');\n }\n }\n\n async updateTransportMethod(transportType: string): Promise<boolean> {\n if (!this.iframeLoaded) {\n throw new Error('The iframe is not loaded yet');\n }\n\n const response = await this.#sendMessage({\n action: IFrameMessageAction.LedgerUpdateTransport,\n params: { transportType },\n });\n\n if ('success' in response && response.success) {\n return true;\n }\n\n throw new Error('Ledger transport could not be updated');\n }\n\n async getPublicKey(\n params: GetPublicKeyParams,\n ): Promise<GetPublicKeyResponse> {\n return this.#deviceActionMessage(\n IFrameMessageAction.LedgerUnlock,\n params,\n USER_ACTION_REQUEST_TIMEOUT,\n );\n }\n\n async deviceSignTransaction(\n params: LedgerSignTransactionParams,\n ): Promise<LedgerSignTransactionResponse> {\n return this.#deviceActionMessage(\n IFrameMessageAction.LedgerSignTransaction,\n params,\n USER_ACTION_REQUEST_TIMEOUT,\n );\n }\n\n async deviceSignMessage(\n params: LedgerSignMessageParams,\n ): Promise<LedgerSignMessageResponse> {\n return this.#deviceActionMessage(\n IFrameMessageAction.LedgerSignPersonalMessage,\n params,\n USER_ACTION_REQUEST_TIMEOUT,\n );\n }\n\n async deviceSignTypedData(\n params: LedgerSignTypedDataParams,\n ): Promise<LedgerSignTypedDataResponse> {\n return this.#deviceActionMessage(\n IFrameMessageAction.LedgerSignTypedData,\n params,\n USER_ACTION_REQUEST_TIMEOUT,\n );\n }\n\n async #deviceActionMessage(\n action: IFrameMessageAction.LedgerUnlock,\n params: GetPublicKeyParams,\n timeout: number,\n ): Promise<GetPublicKeyResponse>;\n\n async #deviceActionMessage(\n action: IFrameMessageAction.LedgerSignTransaction,\n params: LedgerSignTransactionParams,\n timeout: number,\n ): Promise<LedgerSignTransactionResponse>;\n\n async #deviceActionMessage(\n action: IFrameMessageAction.LedgerSignPersonalMessage,\n params: LedgerSignMessageParams,\n timeout: number,\n ): Promise<LedgerSignMessageResponse>;\n\n async #deviceActionMessage(\n action: IFrameMessageAction.LedgerSignTypedData,\n params: LedgerSignTypedDataParams,\n timeout: number,\n ): Promise<LedgerSignTypedDataResponse>;\n\n async #deviceActionMessage(\n ...[action, params, timeout]:\n | [IFrameMessageAction.LedgerUnlock, GetPublicKeyParams, number]\n | [\n IFrameMessageAction.LedgerSignTransaction,\n LedgerSignTransactionParams,\n number,\n ]\n | [\n IFrameMessageAction.LedgerSignPersonalMessage,\n LedgerSignMessageParams,\n number,\n ]\n | [\n IFrameMessageAction.LedgerSignTypedData,\n LedgerSignTypedDataParams,\n number,\n ]\n ): Promise<\n | GetPublicKeyResponse\n | LedgerSignTransactionResponse\n | LedgerSignMessageResponse\n | LedgerSignTypedDataResponse\n > {\n const response = await this.#sendMessage({ action, params }, timeout);\n\n if ('payload' in response && response.payload) {\n if ('success' in response && response.success) {\n return response.payload;\n }\n if ('error' in response.payload) {\n throw response.payload.error;\n }\n }\n\n throw new Error('Unknown error occurred');\n }\n\n async #setupIframe(bridgeUrl: string): Promise<void> {\n return new Promise((resolve) => {\n this.iframe = document.createElement('iframe');\n this.iframe.src = bridgeUrl;\n this.iframe.allow = `hid 'src'`;\n this.iframe.onload = async (): Promise<void> => {\n this.iframeLoaded = true;\n resolve();\n };\n document.head.appendChild(this.iframe);\n });\n }\n\n #getOrigin(bridgeUrl: string): string {\n const tmp = bridgeUrl.split('/');\n tmp.splice(-1, 1);\n return tmp.join('/');\n }\n\n #eventListener(\n bridgeUrl: string,\n eventMessage: {\n origin: string;\n data: IFrameMessageResponse;\n },\n ): void {\n const { origin, data } = eventMessage;\n\n if (origin !== this.#getOrigin(bridgeUrl)) {\n return;\n }\n\n if (data) {\n const messageResponseHandle = this.#messageResponseHandles.get(\n data.messageId,\n );\n if (messageResponseHandle) {\n messageResponseHandle.resolve(data);\n this.#messageResponseHandles.delete(data.messageId);\n } else if (data.action === IFrameMessageAction.LedgerConnectionChange) {\n this.isDeviceConnected = data.payload.connected;\n }\n }\n }\n\n async #sendMessage<TAction extends IFrameMessageAction>(\n message: IFrameMessage<TAction>,\n timeout = IFRAME_MESSAGE_TIMEOUT,\n ): Promise<IFrameMessageResponse> {\n this.currentMessageId += 1;\n\n const postMsg: IFramePostMessage<TAction> = {\n ...message,\n messageId: this.currentMessageId,\n target: LEDGER_IFRAME_ID,\n };\n\n const messageResponseHandle =\n createDeferredPromise<IFrameMessageResponse>();\n\n this.#messageResponseHandles.set(\n this.currentMessageId,\n messageResponseHandle,\n );\n\n if (!this.iframeLoaded || !this.iframe?.contentWindow) {\n throw new Error('The iframe is not loaded yet');\n }\n\n setTimeout(() => {\n if (this.#messageResponseHandles.has(postMsg.messageId)) {\n this.#messageResponseHandles.delete(postMsg.messageId);\n messageResponseHandle.reject(\n new Error('Ledger iframe message timeout'),\n );\n }\n }, timeout);\n\n this.iframe.contentWindow.postMessage(postMsg, '*');\n\n return messageResponseHandle.promise;\n }\n\n #validateConfiguration(opts: LedgerIframeBridgeOptions): void {\n if (typeof opts.bridgeUrl !== 'string' || opts.bridgeUrl.length === 0) {\n throw new Error('bridgeURL is not a valid URL');\n }\n }\n}\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"ledger-iframe-bridge.d.cts","sourceRoot":"","sources":["../src/ledger-iframe-bridge.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"ledger-iframe-bridge.d.cts","sourceRoot":"","sources":["../src/ledger-iframe-bridge.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"ledger-iframe-bridge.d.mts","sourceRoot":"","sources":["../src/ledger-iframe-bridge.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"ledger-iframe-bridge.d.mts","sourceRoot":"","sources":["../src/ledger-iframe-bridge.ts"],"names":[],"mappings":"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"}
@@ -13,6 +13,7 @@ var _LedgerIframeBridge_instances, _LedgerIframeBridge_opts, _LedgerIframeBridge
13
13
  import { createDeferredPromise } from "@metamask/utils";
14
14
  const LEDGER_IFRAME_ID = 'LEDGER-IFRAME';
15
15
  const IFRAME_MESSAGE_TIMEOUT = 4000;
16
+ const USER_ACTION_REQUEST_TIMEOUT = 20000;
16
17
  export var IFrameMessageAction;
17
18
  (function (IFrameMessageAction) {
18
19
  IFrameMessageAction["LedgerIsIframeReady"] = "ledger-is-iframe-ready";
@@ -89,20 +90,20 @@ export class LedgerIframeBridge {
89
90
  throw new Error('Ledger transport could not be updated');
90
91
  }
91
92
  async getPublicKey(params) {
92
- return __classPrivateFieldGet(this, _LedgerIframeBridge_instances, "m", _LedgerIframeBridge_deviceActionMessage).call(this, IFrameMessageAction.LedgerUnlock, params);
93
+ return __classPrivateFieldGet(this, _LedgerIframeBridge_instances, "m", _LedgerIframeBridge_deviceActionMessage).call(this, IFrameMessageAction.LedgerUnlock, params, USER_ACTION_REQUEST_TIMEOUT);
93
94
  }
94
95
  async deviceSignTransaction(params) {
95
- return __classPrivateFieldGet(this, _LedgerIframeBridge_instances, "m", _LedgerIframeBridge_deviceActionMessage).call(this, IFrameMessageAction.LedgerSignTransaction, params);
96
+ return __classPrivateFieldGet(this, _LedgerIframeBridge_instances, "m", _LedgerIframeBridge_deviceActionMessage).call(this, IFrameMessageAction.LedgerSignTransaction, params, USER_ACTION_REQUEST_TIMEOUT);
96
97
  }
97
98
  async deviceSignMessage(params) {
98
- return __classPrivateFieldGet(this, _LedgerIframeBridge_instances, "m", _LedgerIframeBridge_deviceActionMessage).call(this, IFrameMessageAction.LedgerSignPersonalMessage, params);
99
+ return __classPrivateFieldGet(this, _LedgerIframeBridge_instances, "m", _LedgerIframeBridge_deviceActionMessage).call(this, IFrameMessageAction.LedgerSignPersonalMessage, params, USER_ACTION_REQUEST_TIMEOUT);
99
100
  }
100
101
  async deviceSignTypedData(params) {
101
- return __classPrivateFieldGet(this, _LedgerIframeBridge_instances, "m", _LedgerIframeBridge_deviceActionMessage).call(this, IFrameMessageAction.LedgerSignTypedData, params);
102
+ return __classPrivateFieldGet(this, _LedgerIframeBridge_instances, "m", _LedgerIframeBridge_deviceActionMessage).call(this, IFrameMessageAction.LedgerSignTypedData, params, USER_ACTION_REQUEST_TIMEOUT);
102
103
  }
103
104
  }
104
- _LedgerIframeBridge_opts = new WeakMap(), _LedgerIframeBridge_messageResponseHandles = new WeakMap(), _LedgerIframeBridge_instances = new WeakSet(), _LedgerIframeBridge_deviceActionMessage = async function _LedgerIframeBridge_deviceActionMessage(...[action, params]) {
105
- const response = await __classPrivateFieldGet(this, _LedgerIframeBridge_instances, "m", _LedgerIframeBridge_sendMessage).call(this, { action, params });
105
+ _LedgerIframeBridge_opts = new WeakMap(), _LedgerIframeBridge_messageResponseHandles = new WeakMap(), _LedgerIframeBridge_instances = new WeakSet(), _LedgerIframeBridge_deviceActionMessage = async function _LedgerIframeBridge_deviceActionMessage(...[action, params, timeout]) {
106
+ const response = await __classPrivateFieldGet(this, _LedgerIframeBridge_instances, "m", _LedgerIframeBridge_sendMessage).call(this, { action, params }, timeout);
106
107
  if ('payload' in response && response.payload) {
107
108
  if ('success' in response && response.success) {
108
109
  return response.payload;
@@ -142,7 +143,7 @@ _LedgerIframeBridge_opts = new WeakMap(), _LedgerIframeBridge_messageResponseHan
142
143
  this.isDeviceConnected = data.payload.connected;
143
144
  }
144
145
  }
145
- }, _LedgerIframeBridge_sendMessage = async function _LedgerIframeBridge_sendMessage(message) {
146
+ }, _LedgerIframeBridge_sendMessage = async function _LedgerIframeBridge_sendMessage(message, timeout = IFRAME_MESSAGE_TIMEOUT) {
146
147
  this.currentMessageId += 1;
147
148
  const postMsg = {
148
149
  ...message,
@@ -159,7 +160,7 @@ _LedgerIframeBridge_opts = new WeakMap(), _LedgerIframeBridge_messageResponseHan
159
160
  __classPrivateFieldGet(this, _LedgerIframeBridge_messageResponseHandles, "f").delete(postMsg.messageId);
160
161
  messageResponseHandle.reject(new Error('Ledger iframe message timeout'));
161
162
  }
162
- }, IFRAME_MESSAGE_TIMEOUT);
163
+ }, timeout);
163
164
  this.iframe.contentWindow.postMessage(postMsg, '*');
164
165
  return messageResponseHandle.promise;
165
166
  }, _LedgerIframeBridge_validateConfiguration = function _LedgerIframeBridge_validateConfiguration(opts) {
@@ -1 +1 @@
1
- {"version":3,"file":"ledger-iframe-bridge.mjs","sourceRoot":"","sources":["../src/ledger-iframe-bridge.ts"],"names":[],"mappings":"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","sourcesContent":["import { createDeferredPromise, DeferredPromise } from '@metamask/utils';\n\nimport {\n GetPublicKeyParams,\n GetPublicKeyResponse,\n LedgerBridge,\n LedgerSignMessageParams,\n LedgerSignMessageResponse,\n LedgerSignTransactionParams,\n LedgerSignTransactionResponse,\n LedgerSignTypedDataParams,\n LedgerSignTypedDataResponse,\n} from './ledger-bridge';\n\nconst LEDGER_IFRAME_ID = 'LEDGER-IFRAME';\n\nconst IFRAME_MESSAGE_TIMEOUT = 4000;\n\nexport enum IFrameMessageAction {\n LedgerIsIframeReady = 'ledger-is-iframe-ready',\n LedgerConnectionChange = 'ledger-connection-change',\n LedgerUnlock = 'ledger-unlock',\n LedgerMakeApp = 'ledger-make-app',\n LedgerUpdateTransport = 'ledger-update-transport',\n LedgerSignTransaction = 'ledger-sign-transaction',\n LedgerSignPersonalMessage = 'ledger-sign-personal-message',\n LedgerSignTypedData = 'ledger-sign-typed-data',\n}\n\ntype IFrameMessageResponseStub<\n SuccessResult extends Record<string, unknown>,\n FailureResult = Error,\n> = {\n messageId: number;\n} & (\n | { success: true; payload: SuccessResult }\n | { success: false; payload: { error: FailureResult } }\n);\n\ntype LedgerConnectionChangeActionResponse = {\n messageId: number;\n action: IFrameMessageAction.LedgerConnectionChange;\n payload: { connected: boolean };\n};\n\ntype LedgerMakeAppActionResponse = {\n messageId: number;\n action: IFrameMessageAction.LedgerMakeApp;\n} & ({ success: true } | { success: false; error?: unknown });\n\ntype LedgerUpdateTransportActionResponse = {\n messageId: number;\n action: IFrameMessageAction.LedgerUpdateTransport;\n success: boolean;\n};\n\ntype LedgerUnlockActionResponse = {\n action: IFrameMessageAction.LedgerUnlock;\n} & IFrameMessageResponseStub<GetPublicKeyResponse>;\n\ntype LedgerSignTransactionActionResponse = {\n action: IFrameMessageAction.LedgerSignTransaction;\n} & IFrameMessageResponseStub<LedgerSignTransactionResponse>;\n\ntype LedgerSignPersonalMessageActionResponse = {\n action: IFrameMessageAction.LedgerSignPersonalMessage;\n} & IFrameMessageResponseStub<LedgerSignMessageResponse>;\n\ntype LedgerSignTypedDataActionResponse = {\n action: IFrameMessageAction.LedgerSignTypedData;\n} & IFrameMessageResponseStub<LedgerSignTypedDataResponse>;\n\nexport type IFrameMessageResponse =\n | LedgerConnectionChangeActionResponse\n | LedgerMakeAppActionResponse\n | LedgerUpdateTransportActionResponse\n | LedgerUnlockActionResponse\n | LedgerSignTransactionActionResponse\n | LedgerSignPersonalMessageActionResponse\n | LedgerSignTypedDataActionResponse;\n\ntype IFrameMessage<TAction extends IFrameMessageAction> = {\n action: TAction;\n params?: Readonly<Record<string, unknown>>;\n};\n\ntype IFramePostMessage<TAction extends IFrameMessageAction> =\n IFrameMessage<TAction> & {\n messageId: number;\n target: typeof LEDGER_IFRAME_ID;\n };\n\nexport type LedgerIframeBridgeOptions = {\n bridgeUrl: string;\n};\n\nexport class LedgerIframeBridge\n implements LedgerBridge<LedgerIframeBridgeOptions>\n{\n iframe?: HTMLIFrameElement;\n\n iframeLoaded = false;\n\n readonly #opts: LedgerIframeBridgeOptions;\n\n eventListener?: (eventMessage: {\n origin: string;\n data: IFrameMessageResponse;\n }) => void;\n\n isDeviceConnected = false;\n\n currentMessageId = 0;\n\n readonly #messageResponseHandles: Map<\n number,\n DeferredPromise<IFrameMessageResponse>\n > = new Map();\n\n constructor(\n opts: LedgerIframeBridgeOptions = {\n bridgeUrl: 'https://metamask.github.io/eth-ledger-bridge-keyring',\n },\n ) {\n this.#validateConfiguration(opts);\n this.#opts = {\n bridgeUrl: opts?.bridgeUrl,\n };\n }\n\n async init(): Promise<void> {\n await this.#setupIframe(this.#opts.bridgeUrl);\n\n this.eventListener = this.#eventListener.bind(this, this.#opts.bridgeUrl);\n\n window.addEventListener('message', this.eventListener);\n }\n\n async destroy(): Promise<void> {\n if (this.eventListener) {\n window.removeEventListener('message', this.eventListener);\n }\n }\n\n async getOptions(): Promise<LedgerIframeBridgeOptions> {\n return this.#opts;\n }\n\n async setOptions(opts: LedgerIframeBridgeOptions): Promise<void> {\n this.#validateConfiguration(opts);\n if (this.#opts?.bridgeUrl !== opts.bridgeUrl) {\n this.#opts.bridgeUrl = opts.bridgeUrl;\n await this.destroy();\n await this.init();\n }\n }\n\n async attemptMakeApp(): Promise<boolean> {\n const response = await this.#sendMessage({\n action: IFrameMessageAction.LedgerMakeApp,\n });\n\n if ('success' in response && response.success) {\n return true;\n } else if ('error' in response) {\n // Assuming this is using an `Error` type:\n throw response.error;\n } else {\n throw new Error('Unknown error occurred');\n }\n }\n\n async updateTransportMethod(transportType: string): Promise<boolean> {\n if (!this.iframeLoaded) {\n throw new Error('The iframe is not loaded yet');\n }\n\n const response = await this.#sendMessage({\n action: IFrameMessageAction.LedgerUpdateTransport,\n params: { transportType },\n });\n\n if ('success' in response && response.success) {\n return true;\n }\n\n throw new Error('Ledger transport could not be updated');\n }\n\n async getPublicKey(\n params: GetPublicKeyParams,\n ): Promise<GetPublicKeyResponse> {\n return this.#deviceActionMessage(IFrameMessageAction.LedgerUnlock, params);\n }\n\n async deviceSignTransaction(\n params: LedgerSignTransactionParams,\n ): Promise<LedgerSignTransactionResponse> {\n return this.#deviceActionMessage(\n IFrameMessageAction.LedgerSignTransaction,\n params,\n );\n }\n\n async deviceSignMessage(\n params: LedgerSignMessageParams,\n ): Promise<LedgerSignMessageResponse> {\n return this.#deviceActionMessage(\n IFrameMessageAction.LedgerSignPersonalMessage,\n params,\n );\n }\n\n async deviceSignTypedData(\n params: LedgerSignTypedDataParams,\n ): Promise<LedgerSignTypedDataResponse> {\n return this.#deviceActionMessage(\n IFrameMessageAction.LedgerSignTypedData,\n params,\n );\n }\n\n async #deviceActionMessage(\n action: IFrameMessageAction.LedgerUnlock,\n params: GetPublicKeyParams,\n ): Promise<GetPublicKeyResponse>;\n\n async #deviceActionMessage(\n action: IFrameMessageAction.LedgerSignTransaction,\n params: LedgerSignTransactionParams,\n ): Promise<LedgerSignTransactionResponse>;\n\n async #deviceActionMessage(\n action: IFrameMessageAction.LedgerSignPersonalMessage,\n params: LedgerSignMessageParams,\n ): Promise<LedgerSignMessageResponse>;\n\n async #deviceActionMessage(\n action: IFrameMessageAction.LedgerSignTypedData,\n params: LedgerSignTypedDataParams,\n ): Promise<LedgerSignTypedDataResponse>;\n\n async #deviceActionMessage(\n ...[action, params]:\n | [IFrameMessageAction.LedgerUnlock, GetPublicKeyParams]\n | [IFrameMessageAction.LedgerSignTransaction, LedgerSignTransactionParams]\n | [IFrameMessageAction.LedgerSignPersonalMessage, LedgerSignMessageParams]\n | [IFrameMessageAction.LedgerSignTypedData, LedgerSignTypedDataParams]\n ): Promise<\n | GetPublicKeyResponse\n | LedgerSignTransactionResponse\n | LedgerSignMessageResponse\n | LedgerSignTypedDataResponse\n > {\n const response = await this.#sendMessage({ action, params });\n\n if ('payload' in response && response.payload) {\n if ('success' in response && response.success) {\n return response.payload;\n }\n if ('error' in response.payload) {\n throw response.payload.error;\n }\n }\n\n throw new Error('Unknown error occurred');\n }\n\n async #setupIframe(bridgeUrl: string): Promise<void> {\n return new Promise((resolve) => {\n this.iframe = document.createElement('iframe');\n this.iframe.src = bridgeUrl;\n this.iframe.allow = `hid 'src'`;\n this.iframe.onload = async (): Promise<void> => {\n this.iframeLoaded = true;\n resolve();\n };\n document.head.appendChild(this.iframe);\n });\n }\n\n #getOrigin(bridgeUrl: string): string {\n const tmp = bridgeUrl.split('/');\n tmp.splice(-1, 1);\n return tmp.join('/');\n }\n\n #eventListener(\n bridgeUrl: string,\n eventMessage: {\n origin: string;\n data: IFrameMessageResponse;\n },\n ): void {\n const { origin, data } = eventMessage;\n\n if (origin !== this.#getOrigin(bridgeUrl)) {\n return;\n }\n\n if (data) {\n const messageResponseHandle = this.#messageResponseHandles.get(\n data.messageId,\n );\n if (messageResponseHandle) {\n messageResponseHandle.resolve(data);\n this.#messageResponseHandles.delete(data.messageId);\n } else if (data.action === IFrameMessageAction.LedgerConnectionChange) {\n this.isDeviceConnected = data.payload.connected;\n }\n }\n }\n\n async #sendMessage<TAction extends IFrameMessageAction>(\n message: IFrameMessage<TAction>,\n ): Promise<IFrameMessageResponse> {\n this.currentMessageId += 1;\n\n const postMsg: IFramePostMessage<TAction> = {\n ...message,\n messageId: this.currentMessageId,\n target: LEDGER_IFRAME_ID,\n };\n\n const messageResponseHandle =\n createDeferredPromise<IFrameMessageResponse>();\n\n this.#messageResponseHandles.set(\n this.currentMessageId,\n messageResponseHandle,\n );\n\n if (!this.iframeLoaded || !this.iframe?.contentWindow) {\n throw new Error('The iframe is not loaded yet');\n }\n\n setTimeout(() => {\n if (this.#messageResponseHandles.has(postMsg.messageId)) {\n this.#messageResponseHandles.delete(postMsg.messageId);\n messageResponseHandle.reject(\n new Error('Ledger iframe message timeout'),\n );\n }\n }, IFRAME_MESSAGE_TIMEOUT);\n\n this.iframe.contentWindow.postMessage(postMsg, '*');\n\n return messageResponseHandle.promise;\n }\n\n #validateConfiguration(opts: LedgerIframeBridgeOptions): void {\n if (typeof opts.bridgeUrl !== 'string' || opts.bridgeUrl.length === 0) {\n throw new Error('bridgeURL is not a valid URL');\n }\n }\n}\n"]}
1
+ {"version":3,"file":"ledger-iframe-bridge.mjs","sourceRoot":"","sources":["../src/ledger-iframe-bridge.ts"],"names":[],"mappings":"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","sourcesContent":["import { createDeferredPromise, DeferredPromise } from '@metamask/utils';\n\nimport {\n GetPublicKeyParams,\n GetPublicKeyResponse,\n LedgerBridge,\n LedgerSignMessageParams,\n LedgerSignMessageResponse,\n LedgerSignTransactionParams,\n LedgerSignTransactionResponse,\n LedgerSignTypedDataParams,\n LedgerSignTypedDataResponse,\n} from './ledger-bridge';\n\nconst LEDGER_IFRAME_ID = 'LEDGER-IFRAME';\n\nconst IFRAME_MESSAGE_TIMEOUT = 4000;\n\nconst USER_ACTION_REQUEST_TIMEOUT = 20_000;\n\nexport enum IFrameMessageAction {\n LedgerIsIframeReady = 'ledger-is-iframe-ready',\n LedgerConnectionChange = 'ledger-connection-change',\n LedgerUnlock = 'ledger-unlock',\n LedgerMakeApp = 'ledger-make-app',\n LedgerUpdateTransport = 'ledger-update-transport',\n LedgerSignTransaction = 'ledger-sign-transaction',\n LedgerSignPersonalMessage = 'ledger-sign-personal-message',\n LedgerSignTypedData = 'ledger-sign-typed-data',\n}\n\ntype IFrameMessageResponseStub<\n SuccessResult extends Record<string, unknown>,\n FailureResult = Error,\n> = {\n messageId: number;\n} & (\n | { success: true; payload: SuccessResult }\n | { success: false; payload: { error: FailureResult } }\n);\n\ntype LedgerConnectionChangeActionResponse = {\n messageId: number;\n action: IFrameMessageAction.LedgerConnectionChange;\n payload: { connected: boolean };\n};\n\ntype LedgerMakeAppActionResponse = {\n messageId: number;\n action: IFrameMessageAction.LedgerMakeApp;\n} & ({ success: true } | { success: false; error?: unknown });\n\ntype LedgerUpdateTransportActionResponse = {\n messageId: number;\n action: IFrameMessageAction.LedgerUpdateTransport;\n success: boolean;\n};\n\ntype LedgerUnlockActionResponse = {\n action: IFrameMessageAction.LedgerUnlock;\n} & IFrameMessageResponseStub<GetPublicKeyResponse>;\n\ntype LedgerSignTransactionActionResponse = {\n action: IFrameMessageAction.LedgerSignTransaction;\n} & IFrameMessageResponseStub<LedgerSignTransactionResponse>;\n\ntype LedgerSignPersonalMessageActionResponse = {\n action: IFrameMessageAction.LedgerSignPersonalMessage;\n} & IFrameMessageResponseStub<LedgerSignMessageResponse>;\n\ntype LedgerSignTypedDataActionResponse = {\n action: IFrameMessageAction.LedgerSignTypedData;\n} & IFrameMessageResponseStub<LedgerSignTypedDataResponse>;\n\nexport type IFrameMessageResponse =\n | LedgerConnectionChangeActionResponse\n | LedgerMakeAppActionResponse\n | LedgerUpdateTransportActionResponse\n | LedgerUnlockActionResponse\n | LedgerSignTransactionActionResponse\n | LedgerSignPersonalMessageActionResponse\n | LedgerSignTypedDataActionResponse;\n\ntype IFrameMessage<TAction extends IFrameMessageAction> = {\n action: TAction;\n params?: Readonly<Record<string, unknown>>;\n};\n\ntype IFramePostMessage<TAction extends IFrameMessageAction> =\n IFrameMessage<TAction> & {\n messageId: number;\n target: typeof LEDGER_IFRAME_ID;\n };\n\nexport type LedgerIframeBridgeOptions = {\n bridgeUrl: string;\n};\n\nexport class LedgerIframeBridge\n implements LedgerBridge<LedgerIframeBridgeOptions>\n{\n iframe?: HTMLIFrameElement;\n\n iframeLoaded = false;\n\n readonly #opts: LedgerIframeBridgeOptions;\n\n eventListener?: (eventMessage: {\n origin: string;\n data: IFrameMessageResponse;\n }) => void;\n\n isDeviceConnected = false;\n\n currentMessageId = 0;\n\n readonly #messageResponseHandles: Map<\n number,\n DeferredPromise<IFrameMessageResponse>\n > = new Map();\n\n constructor(\n opts: LedgerIframeBridgeOptions = {\n bridgeUrl: 'https://metamask.github.io/eth-ledger-bridge-keyring',\n },\n ) {\n this.#validateConfiguration(opts);\n this.#opts = {\n bridgeUrl: opts?.bridgeUrl,\n };\n }\n\n async init(): Promise<void> {\n await this.#setupIframe(this.#opts.bridgeUrl);\n\n this.eventListener = this.#eventListener.bind(this, this.#opts.bridgeUrl);\n\n window.addEventListener('message', this.eventListener);\n }\n\n async destroy(): Promise<void> {\n if (this.eventListener) {\n window.removeEventListener('message', this.eventListener);\n }\n }\n\n async getOptions(): Promise<LedgerIframeBridgeOptions> {\n return this.#opts;\n }\n\n async setOptions(opts: LedgerIframeBridgeOptions): Promise<void> {\n this.#validateConfiguration(opts);\n if (this.#opts?.bridgeUrl !== opts.bridgeUrl) {\n this.#opts.bridgeUrl = opts.bridgeUrl;\n await this.destroy();\n await this.init();\n }\n }\n\n async attemptMakeApp(): Promise<boolean> {\n const response = await this.#sendMessage({\n action: IFrameMessageAction.LedgerMakeApp,\n });\n\n if ('success' in response && response.success) {\n return true;\n } else if ('error' in response) {\n // Assuming this is using an `Error` type:\n throw response.error;\n } else {\n throw new Error('Unknown error occurred');\n }\n }\n\n async updateTransportMethod(transportType: string): Promise<boolean> {\n if (!this.iframeLoaded) {\n throw new Error('The iframe is not loaded yet');\n }\n\n const response = await this.#sendMessage({\n action: IFrameMessageAction.LedgerUpdateTransport,\n params: { transportType },\n });\n\n if ('success' in response && response.success) {\n return true;\n }\n\n throw new Error('Ledger transport could not be updated');\n }\n\n async getPublicKey(\n params: GetPublicKeyParams,\n ): Promise<GetPublicKeyResponse> {\n return this.#deviceActionMessage(\n IFrameMessageAction.LedgerUnlock,\n params,\n USER_ACTION_REQUEST_TIMEOUT,\n );\n }\n\n async deviceSignTransaction(\n params: LedgerSignTransactionParams,\n ): Promise<LedgerSignTransactionResponse> {\n return this.#deviceActionMessage(\n IFrameMessageAction.LedgerSignTransaction,\n params,\n USER_ACTION_REQUEST_TIMEOUT,\n );\n }\n\n async deviceSignMessage(\n params: LedgerSignMessageParams,\n ): Promise<LedgerSignMessageResponse> {\n return this.#deviceActionMessage(\n IFrameMessageAction.LedgerSignPersonalMessage,\n params,\n USER_ACTION_REQUEST_TIMEOUT,\n );\n }\n\n async deviceSignTypedData(\n params: LedgerSignTypedDataParams,\n ): Promise<LedgerSignTypedDataResponse> {\n return this.#deviceActionMessage(\n IFrameMessageAction.LedgerSignTypedData,\n params,\n USER_ACTION_REQUEST_TIMEOUT,\n );\n }\n\n async #deviceActionMessage(\n action: IFrameMessageAction.LedgerUnlock,\n params: GetPublicKeyParams,\n timeout: number,\n ): Promise<GetPublicKeyResponse>;\n\n async #deviceActionMessage(\n action: IFrameMessageAction.LedgerSignTransaction,\n params: LedgerSignTransactionParams,\n timeout: number,\n ): Promise<LedgerSignTransactionResponse>;\n\n async #deviceActionMessage(\n action: IFrameMessageAction.LedgerSignPersonalMessage,\n params: LedgerSignMessageParams,\n timeout: number,\n ): Promise<LedgerSignMessageResponse>;\n\n async #deviceActionMessage(\n action: IFrameMessageAction.LedgerSignTypedData,\n params: LedgerSignTypedDataParams,\n timeout: number,\n ): Promise<LedgerSignTypedDataResponse>;\n\n async #deviceActionMessage(\n ...[action, params, timeout]:\n | [IFrameMessageAction.LedgerUnlock, GetPublicKeyParams, number]\n | [\n IFrameMessageAction.LedgerSignTransaction,\n LedgerSignTransactionParams,\n number,\n ]\n | [\n IFrameMessageAction.LedgerSignPersonalMessage,\n LedgerSignMessageParams,\n number,\n ]\n | [\n IFrameMessageAction.LedgerSignTypedData,\n LedgerSignTypedDataParams,\n number,\n ]\n ): Promise<\n | GetPublicKeyResponse\n | LedgerSignTransactionResponse\n | LedgerSignMessageResponse\n | LedgerSignTypedDataResponse\n > {\n const response = await this.#sendMessage({ action, params }, timeout);\n\n if ('payload' in response && response.payload) {\n if ('success' in response && response.success) {\n return response.payload;\n }\n if ('error' in response.payload) {\n throw response.payload.error;\n }\n }\n\n throw new Error('Unknown error occurred');\n }\n\n async #setupIframe(bridgeUrl: string): Promise<void> {\n return new Promise((resolve) => {\n this.iframe = document.createElement('iframe');\n this.iframe.src = bridgeUrl;\n this.iframe.allow = `hid 'src'`;\n this.iframe.onload = async (): Promise<void> => {\n this.iframeLoaded = true;\n resolve();\n };\n document.head.appendChild(this.iframe);\n });\n }\n\n #getOrigin(bridgeUrl: string): string {\n const tmp = bridgeUrl.split('/');\n tmp.splice(-1, 1);\n return tmp.join('/');\n }\n\n #eventListener(\n bridgeUrl: string,\n eventMessage: {\n origin: string;\n data: IFrameMessageResponse;\n },\n ): void {\n const { origin, data } = eventMessage;\n\n if (origin !== this.#getOrigin(bridgeUrl)) {\n return;\n }\n\n if (data) {\n const messageResponseHandle = this.#messageResponseHandles.get(\n data.messageId,\n );\n if (messageResponseHandle) {\n messageResponseHandle.resolve(data);\n this.#messageResponseHandles.delete(data.messageId);\n } else if (data.action === IFrameMessageAction.LedgerConnectionChange) {\n this.isDeviceConnected = data.payload.connected;\n }\n }\n }\n\n async #sendMessage<TAction extends IFrameMessageAction>(\n message: IFrameMessage<TAction>,\n timeout = IFRAME_MESSAGE_TIMEOUT,\n ): Promise<IFrameMessageResponse> {\n this.currentMessageId += 1;\n\n const postMsg: IFramePostMessage<TAction> = {\n ...message,\n messageId: this.currentMessageId,\n target: LEDGER_IFRAME_ID,\n };\n\n const messageResponseHandle =\n createDeferredPromise<IFrameMessageResponse>();\n\n this.#messageResponseHandles.set(\n this.currentMessageId,\n messageResponseHandle,\n );\n\n if (!this.iframeLoaded || !this.iframe?.contentWindow) {\n throw new Error('The iframe is not loaded yet');\n }\n\n setTimeout(() => {\n if (this.#messageResponseHandles.has(postMsg.messageId)) {\n this.#messageResponseHandles.delete(postMsg.messageId);\n messageResponseHandle.reject(\n new Error('Ledger iframe message timeout'),\n );\n }\n }, timeout);\n\n this.iframe.contentWindow.postMessage(postMsg, '*');\n\n return messageResponseHandle.promise;\n }\n\n #validateConfiguration(opts: LedgerIframeBridgeOptions): void {\n if (typeof opts.bridgeUrl !== 'string' || opts.bridgeUrl.length === 0) {\n throw new Error('bridgeURL is not a valid URL');\n }\n }\n}\n"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@metamask/eth-ledger-bridge-keyring",
3
- "version": "11.0.1",
3
+ "version": "11.0.2",
4
4
  "description": "A MetaMask compatible keyring, for ledger hardware wallets",
5
5
  "keywords": [
6
6
  "ethereum",