@metamask/eth-ledger-bridge-keyring 11.0.1 → 11.0.3
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 +15 -1
- package/dist/ledger-iframe-bridge.cjs +11 -9
- package/dist/ledger-iframe-bridge.cjs.map +1 -1
- package/dist/ledger-iframe-bridge.d.cts.map +1 -1
- package/dist/ledger-iframe-bridge.d.mts.map +1 -1
- package/dist/ledger-iframe-bridge.mjs +11 -9
- package/dist/ledger-iframe-bridge.mjs.map +1 -1
- package/package.json +1 -1
package/CHANGELOG.md
CHANGED
|
@@ -7,6 +7,18 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
|
|
|
7
7
|
|
|
8
8
|
## [Unreleased]
|
|
9
9
|
|
|
10
|
+
## [11.0.3]
|
|
11
|
+
|
|
12
|
+
### Fixed
|
|
13
|
+
|
|
14
|
+
- Removed timeout for messages requiring user actions ([#279](https://github.com/MetaMask/accounts/pull/279))
|
|
15
|
+
|
|
16
|
+
## [11.0.2]
|
|
17
|
+
|
|
18
|
+
### Fixed
|
|
19
|
+
|
|
20
|
+
- Increase timeout for user action requests ([#275](https://github.com/MetaMask/accounts/pull/275))
|
|
21
|
+
|
|
10
22
|
## [11.0.1]
|
|
11
23
|
|
|
12
24
|
### Fixed
|
|
@@ -312,7 +324,9 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
|
|
|
312
324
|
|
|
313
325
|
- Support new versions of ethereumjs/tx ([#68](https://github.com/MetaMask/eth-ledger-bridge-keyring/pull/68))
|
|
314
326
|
|
|
315
|
-
[Unreleased]: https://github.com/MetaMask/accounts/compare/@metamask/eth-ledger-bridge-keyring@11.0.
|
|
327
|
+
[Unreleased]: https://github.com/MetaMask/accounts/compare/@metamask/eth-ledger-bridge-keyring@11.0.3...HEAD
|
|
328
|
+
[11.0.3]: https://github.com/MetaMask/accounts/compare/@metamask/eth-ledger-bridge-keyring@11.0.2...@metamask/eth-ledger-bridge-keyring@11.0.3
|
|
329
|
+
[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
330
|
[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
331
|
[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
332
|
[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
|
|
@@ -66,7 +66,7 @@ class LedgerIframeBridge {
|
|
|
66
66
|
async attemptMakeApp() {
|
|
67
67
|
const response = await __classPrivateFieldGet(this, _LedgerIframeBridge_instances, "m", _LedgerIframeBridge_sendMessage).call(this, {
|
|
68
68
|
action: IFrameMessageAction.LedgerMakeApp,
|
|
69
|
-
});
|
|
69
|
+
}, { timeout: IFRAME_MESSAGE_TIMEOUT });
|
|
70
70
|
if ('success' in response && response.success) {
|
|
71
71
|
return true;
|
|
72
72
|
}
|
|
@@ -85,7 +85,7 @@ class LedgerIframeBridge {
|
|
|
85
85
|
const response = await __classPrivateFieldGet(this, _LedgerIframeBridge_instances, "m", _LedgerIframeBridge_sendMessage).call(this, {
|
|
86
86
|
action: IFrameMessageAction.LedgerUpdateTransport,
|
|
87
87
|
params: { transportType },
|
|
88
|
-
});
|
|
88
|
+
}, { timeout: IFRAME_MESSAGE_TIMEOUT });
|
|
89
89
|
if ('success' in response && response.success) {
|
|
90
90
|
return true;
|
|
91
91
|
}
|
|
@@ -146,7 +146,7 @@ _LedgerIframeBridge_opts = new WeakMap(), _LedgerIframeBridge_messageResponseHan
|
|
|
146
146
|
this.isDeviceConnected = data.payload.connected;
|
|
147
147
|
}
|
|
148
148
|
}
|
|
149
|
-
}, _LedgerIframeBridge_sendMessage = async function _LedgerIframeBridge_sendMessage(message) {
|
|
149
|
+
}, _LedgerIframeBridge_sendMessage = async function _LedgerIframeBridge_sendMessage(message, { timeout } = {}) {
|
|
150
150
|
this.currentMessageId += 1;
|
|
151
151
|
const postMsg = {
|
|
152
152
|
...message,
|
|
@@ -158,12 +158,14 @@ _LedgerIframeBridge_opts = new WeakMap(), _LedgerIframeBridge_messageResponseHan
|
|
|
158
158
|
if (!this.iframeLoaded || !this.iframe?.contentWindow) {
|
|
159
159
|
throw new Error('The iframe is not loaded yet');
|
|
160
160
|
}
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
__classPrivateFieldGet(this, _LedgerIframeBridge_messageResponseHandles, "f").
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
|
|
161
|
+
if (timeout) {
|
|
162
|
+
setTimeout(() => {
|
|
163
|
+
if (__classPrivateFieldGet(this, _LedgerIframeBridge_messageResponseHandles, "f").has(postMsg.messageId)) {
|
|
164
|
+
__classPrivateFieldGet(this, _LedgerIframeBridge_messageResponseHandles, "f").delete(postMsg.messageId);
|
|
165
|
+
messageResponseHandle.reject(new Error('Ledger iframe message timeout'));
|
|
166
|
+
}
|
|
167
|
+
}, timeout);
|
|
168
|
+
}
|
|
167
169
|
this.iframe.contentWindow.postMessage(postMsg, '*');
|
|
168
170
|
return messageResponseHandle.promise;
|
|
169
171
|
}, _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":";;;;;;;;;;;;;;;AAAA,2CAAyE;AAczE,MAAM,gBAAgB,GAAG,eAAe,CAAC;AAEzC,MAAM,sBAAsB,GAAG,IAAI,CAAC;AAEpC,IAAY,mBASX;AATD,WAAY,mBAAmB;IAC7B,qEAA8C,CAAA;IAC9C,0EAAmD,CAAA;IACnD,qDAA8B,CAAA;IAC9B,wDAAiC,CAAA;IACjC,wEAAiD,CAAA;IACjD,wEAAiD,CAAA;IACjD,iFAA0D,CAAA;IAC1D,qEAA8C,CAAA;AAChD,CAAC,EATW,mBAAmB,mCAAnB,mBAAmB,QAS9B;AAqED,MAAa,kBAAkB;IAuB7B,YACE,OAAkC;QAChC,SAAS,EAAE,sDAAsD;KAClE;;QArBH,iBAAY,GAAG,KAAK,CAAC;QAEZ,2CAAiC;QAO1C,sBAAiB,GAAG,KAAK,CAAC;QAE1B,qBAAgB,GAAG,CAAC,CAAC;QAEZ,qDAGL,IAAI,GAAG,EAAE,EAAC;QAOZ,uBAAA,IAAI,gFAAuB,MAA3B,IAAI,EAAwB,IAAI,CAAC,CAAC;QAClC,uBAAA,IAAI,4BAAS;YACX,SAAS,EAAE,IAAI,EAAE,SAAS;SAC3B,MAAA,CAAC;IACJ,CAAC;IAED,KAAK,CAAC,IAAI;QACR,MAAM,uBAAA,IAAI,sEAAa,MAAjB,IAAI,EAAc,uBAAA,IAAI,gCAAM,CAAC,SAAS,CAAC,CAAC;QAE9C,IAAI,CAAC,aAAa,GAAG,uBAAA,IAAI,wEAAe,CAAC,IAAI,CAAC,IAAI,EAAE,uBAAA,IAAI,gCAAM,CAAC,SAAS,CAAC,CAAC;QAE1E,MAAM,CAAC,gBAAgB,CAAC,SAAS,EAAE,IAAI,CAAC,aAAa,CAAC,CAAC;IACzD,CAAC;IAED,KAAK,CAAC,OAAO;QACX,IAAI,IAAI,CAAC,aAAa,EAAE,CAAC;YACvB,MAAM,CAAC,mBAAmB,CAAC,SAAS,EAAE,IAAI,CAAC,aAAa,CAAC,CAAC;QAC5D,CAAC;IACH,CAAC;IAED,KAAK,CAAC,UAAU;QACd,OAAO,uBAAA,IAAI,gCAAM,CAAC;IACpB,CAAC;IAED,KAAK,CAAC,UAAU,CAAC,IAA+B;QAC9C,uBAAA,IAAI,gFAAuB,MAA3B,IAAI,EAAwB,IAAI,CAAC,CAAC;QAClC,IAAI,uBAAA,IAAI,gCAAM,EAAE,SAAS,KAAK,IAAI,CAAC,SAAS,EAAE,CAAC;YAC7C,uBAAA,IAAI,gCAAM,CAAC,SAAS,GAAG,IAAI,CAAC,SAAS,CAAC;YACtC,MAAM,IAAI,CAAC,OAAO,EAAE,CAAC;YACrB,MAAM,IAAI,CAAC,IAAI,EAAE,CAAC;QACpB,CAAC;IACH,CAAC;IAED,KAAK,CAAC,cAAc;QAClB,MAAM,QAAQ,GAAG,MAAM,uBAAA,IAAI,sEAAa,MAAjB,IAAI,EAAc;YACvC,MAAM,EAAE,mBAAmB,CAAC,aAAa;SAC1C,CAAC,CAAC;QAEH,IAAI,SAAS,IAAI,QAAQ,IAAI,QAAQ,CAAC,OAAO,EAAE,CAAC;YAC9C,OAAO,IAAI,CAAC;QACd,CAAC;aAAM,IAAI,OAAO,IAAI,QAAQ,EAAE,CAAC;YAC/B,0CAA0C;YAC1C,MAAM,QAAQ,CAAC,KAAK,CAAC;QACvB,CAAC;aAAM,CAAC;YACN,MAAM,IAAI,KAAK,CAAC,wBAAwB,CAAC,CAAC;QAC5C,CAAC;IACH,CAAC;IAED,KAAK,CAAC,qBAAqB,CAAC,aAAqB;QAC/C,IAAI,CAAC,IAAI,CAAC,YAAY,EAAE,CAAC;YACvB,MAAM,IAAI,KAAK,CAAC,8BAA8B,CAAC,CAAC;QAClD,CAAC;QAED,MAAM,QAAQ,GAAG,MAAM,uBAAA,IAAI,sEAAa,MAAjB,IAAI,EAAc;YACvC,MAAM,EAAE,mBAAmB,CAAC,qBAAqB;YACjD,MAAM,EAAE,EAAE,aAAa,EAAE;SAC1B,CAAC,CAAC;QAEH,IAAI,SAAS,IAAI,QAAQ,IAAI,QAAQ,CAAC,OAAO,EAAE,CAAC;YAC9C,OAAO,IAAI,CAAC;QACd,CAAC;QAED,MAAM,IAAI,KAAK,CAAC,uCAAuC,CAAC,CAAC;IAC3D,CAAC;IAED,KAAK,CAAC,YAAY,CAChB,MAA0B;QAE1B,OAAO,uBAAA,IAAI,8EAAqB,MAAzB,IAAI,EAAsB,mBAAmB,CAAC,YAAY,EAAE,MAAM,CAAC,CAAC;IAC7E,CAAC;IAED,KAAK,CAAC,qBAAqB,CACzB,MAAmC;QAEnC,OAAO,uBAAA,IAAI,8EAAqB,MAAzB,IAAI,EACT,mBAAmB,CAAC,qBAAqB,EACzC,MAAM,CACP,CAAC;IACJ,CAAC;IAED,KAAK,CAAC,iBAAiB,CACrB,MAA+B;QAE/B,OAAO,uBAAA,IAAI,8EAAqB,MAAzB,IAAI,EACT,mBAAmB,CAAC,yBAAyB,EAC7C,MAAM,CACP,CAAC;IACJ,CAAC;IAED,KAAK,CAAC,mBAAmB,CACvB,MAAiC;QAEjC,OAAO,uBAAA,IAAI,8EAAqB,MAAzB,IAAI,EACT,mBAAmB,CAAC,mBAAmB,EACvC,MAAM,CACP,CAAC;IACJ,CAAC;CAuIF;AAnQD,gDAmQC;+LAjHC,KAAK,kDACH,GAAG,CAAC,MAAM,EAAE,MAAM,CAIsD;IAOxE,MAAM,QAAQ,GAAG,MAAM,uBAAA,IAAI,sEAAa,MAAjB,IAAI,EAAc,EAAE,MAAM,EAAE,MAAM,EAAE,CAAC,CAAC;IAE7D,IAAI,SAAS,IAAI,QAAQ,IAAI,QAAQ,CAAC,OAAO,EAAE,CAAC;QAC9C,IAAI,SAAS,IAAI,QAAQ,IAAI,QAAQ,CAAC,OAAO,EAAE,CAAC;YAC9C,OAAO,QAAQ,CAAC,OAAO,CAAC;QAC1B,CAAC;QACD,IAAI,OAAO,IAAI,QAAQ,CAAC,OAAO,EAAE,CAAC;YAChC,MAAM,QAAQ,CAAC,OAAO,CAAC,KAAK,CAAC;QAC/B,CAAC;IACH,CAAC;IAED,MAAM,IAAI,KAAK,CAAC,wBAAwB,CAAC,CAAC;AAC5C,CAAC,oCAED,KAAK,0CAAc,SAAiB;IAClC,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE;QAC7B,IAAI,CAAC,MAAM,GAAG,QAAQ,CAAC,aAAa,CAAC,QAAQ,CAAC,CAAC;QAC/C,IAAI,CAAC,MAAM,CAAC,GAAG,GAAG,SAAS,CAAC;QAC5B,IAAI,CAAC,MAAM,CAAC,KAAK,GAAG,WAAW,CAAC;QAChC,IAAI,CAAC,MAAM,CAAC,MAAM,GAAG,KAAK,IAAmB,EAAE;YAC7C,IAAI,CAAC,YAAY,GAAG,IAAI,CAAC;YACzB,OAAO,EAAE,CAAC;QACZ,CAAC,CAAC;QACF,QAAQ,CAAC,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;IACzC,CAAC,CAAC,CAAC;AACL,CAAC,yEAEU,SAAiB;IAC1B,MAAM,GAAG,GAAG,SAAS,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;IACjC,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;IAClB,OAAO,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;AACvB,CAAC,iFAGC,SAAiB,EACjB,YAGC;IAED,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,GAAG,YAAY,CAAC;IAEtC,IAAI,MAAM,KAAK,uBAAA,IAAI,oEAAW,MAAf,IAAI,EAAY,SAAS,CAAC,EAAE,CAAC;QAC1C,OAAO;IACT,CAAC;IAED,IAAI,IAAI,EAAE,CAAC;QACT,MAAM,qBAAqB,GAAG,uBAAA,IAAI,kDAAwB,CAAC,GAAG,CAC5D,IAAI,CAAC,SAAS,CACf,CAAC;QACF,IAAI,qBAAqB,EAAE,CAAC;YAC1B,qBAAqB,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;YACpC,uBAAA,IAAI,kDAAwB,CAAC,MAAM,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;QACtD,CAAC;aAAM,IAAI,IAAI,CAAC,MAAM,KAAK,mBAAmB,CAAC,sBAAsB,EAAE,CAAC;YACtE,IAAI,CAAC,iBAAiB,GAAG,IAAI,CAAC,OAAO,CAAC,SAAS,CAAC;QAClD,CAAC;IACH,CAAC;AACH,CAAC,oCAED,KAAK,0CACH,OAA+B;IAE/B,IAAI,CAAC,gBAAgB,IAAI,CAAC,CAAC;IAE3B,MAAM,OAAO,GAA+B;QAC1C,GAAG,OAAO;QACV,SAAS,EAAE,IAAI,CAAC,gBAAgB;QAChC,MAAM,EAAE,gBAAgB;KACzB,CAAC;IAEF,MAAM,qBAAqB,GACzB,IAAA,6BAAqB,GAAyB,CAAC;IAEjD,uBAAA,IAAI,kDAAwB,CAAC,GAAG,CAC9B,IAAI,CAAC,gBAAgB,EACrB,qBAAqB,CACtB,CAAC;IAEF,IAAI,CAAC,IAAI,CAAC,YAAY,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,aAAa,EAAE,CAAC;QACtD,MAAM,IAAI,KAAK,CAAC,8BAA8B,CAAC,CAAC;IAClD,CAAC;IAED,UAAU,CAAC,GAAG,EAAE;QACd,IAAI,uBAAA,IAAI,kDAAwB,CAAC,GAAG,CAAC,OAAO,CAAC,SAAS,CAAC,EAAE,CAAC;YACxD,uBAAA,IAAI,kDAAwB,CAAC,MAAM,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC;YACvD,qBAAqB,CAAC,MAAM,CAC1B,IAAI,KAAK,CAAC,+BAA+B,CAAC,CAC3C,CAAC;QACJ,CAAC;IACH,CAAC,EAAE,sBAAsB,CAAC,CAAC;IAE3B,IAAI,CAAC,MAAM,CAAC,aAAa,CAAC,WAAW,CAAC,OAAO,EAAE,GAAG,CAAC,CAAC;IAEpD,OAAO,qBAAqB,CAAC,OAAO,CAAC;AACvC,CAAC,iGAEsB,IAA+B;IACpD,IAAI,OAAO,IAAI,CAAC,SAAS,KAAK,QAAQ,IAAI,IAAI,CAAC,SAAS,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACtE,MAAM,IAAI,KAAK,CAAC,8BAA8B,CAAC,CAAC;IAClD,CAAC;AACH,CAAC","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\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 {\n action: IFrameMessageAction.LedgerMakeApp,\n },\n { timeout: IFRAME_MESSAGE_TIMEOUT },\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 {\n action: IFrameMessageAction.LedgerUpdateTransport,\n params: { transportType },\n },\n { timeout: IFRAME_MESSAGE_TIMEOUT },\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 { timeout }: { timeout?: number } = {},\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 if (timeout) {\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\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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"}
|
|
@@ -63,7 +63,7 @@ export class LedgerIframeBridge {
|
|
|
63
63
|
async attemptMakeApp() {
|
|
64
64
|
const response = await __classPrivateFieldGet(this, _LedgerIframeBridge_instances, "m", _LedgerIframeBridge_sendMessage).call(this, {
|
|
65
65
|
action: IFrameMessageAction.LedgerMakeApp,
|
|
66
|
-
});
|
|
66
|
+
}, { timeout: IFRAME_MESSAGE_TIMEOUT });
|
|
67
67
|
if ('success' in response && response.success) {
|
|
68
68
|
return true;
|
|
69
69
|
}
|
|
@@ -82,7 +82,7 @@ export class LedgerIframeBridge {
|
|
|
82
82
|
const response = await __classPrivateFieldGet(this, _LedgerIframeBridge_instances, "m", _LedgerIframeBridge_sendMessage).call(this, {
|
|
83
83
|
action: IFrameMessageAction.LedgerUpdateTransport,
|
|
84
84
|
params: { transportType },
|
|
85
|
-
});
|
|
85
|
+
}, { timeout: IFRAME_MESSAGE_TIMEOUT });
|
|
86
86
|
if ('success' in response && response.success) {
|
|
87
87
|
return true;
|
|
88
88
|
}
|
|
@@ -142,7 +142,7 @@ _LedgerIframeBridge_opts = new WeakMap(), _LedgerIframeBridge_messageResponseHan
|
|
|
142
142
|
this.isDeviceConnected = data.payload.connected;
|
|
143
143
|
}
|
|
144
144
|
}
|
|
145
|
-
}, _LedgerIframeBridge_sendMessage = async function _LedgerIframeBridge_sendMessage(message) {
|
|
145
|
+
}, _LedgerIframeBridge_sendMessage = async function _LedgerIframeBridge_sendMessage(message, { timeout } = {}) {
|
|
146
146
|
this.currentMessageId += 1;
|
|
147
147
|
const postMsg = {
|
|
148
148
|
...message,
|
|
@@ -154,12 +154,14 @@ _LedgerIframeBridge_opts = new WeakMap(), _LedgerIframeBridge_messageResponseHan
|
|
|
154
154
|
if (!this.iframeLoaded || !this.iframe?.contentWindow) {
|
|
155
155
|
throw new Error('The iframe is not loaded yet');
|
|
156
156
|
}
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
__classPrivateFieldGet(this, _LedgerIframeBridge_messageResponseHandles, "f").
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
157
|
+
if (timeout) {
|
|
158
|
+
setTimeout(() => {
|
|
159
|
+
if (__classPrivateFieldGet(this, _LedgerIframeBridge_messageResponseHandles, "f").has(postMsg.messageId)) {
|
|
160
|
+
__classPrivateFieldGet(this, _LedgerIframeBridge_messageResponseHandles, "f").delete(postMsg.messageId);
|
|
161
|
+
messageResponseHandle.reject(new Error('Ledger iframe message timeout'));
|
|
162
|
+
}
|
|
163
|
+
}, timeout);
|
|
164
|
+
}
|
|
163
165
|
this.iframe.contentWindow.postMessage(postMsg, '*');
|
|
164
166
|
return messageResponseHandle.promise;
|
|
165
167
|
}, _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\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 {\n action: IFrameMessageAction.LedgerMakeApp,\n },\n { timeout: IFRAME_MESSAGE_TIMEOUT },\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 {\n action: IFrameMessageAction.LedgerUpdateTransport,\n params: { transportType },\n },\n { timeout: IFRAME_MESSAGE_TIMEOUT },\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 { timeout }: { timeout?: number } = {},\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 if (timeout) {\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\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"]}
|