@@ -16,8 +16,6 @@ const LEDGER_IFRAME_ID = 'LEDGER-IFRAME';
16
16
17
17
const IFRAME_MESSAGE_TIMEOUT = 4000 ;
18
18
19
- const USER_ACTION_REQUEST_TIMEOUT = 20_000 ;
20
-
21
19
export enum IFrameMessageAction {
22
20
LedgerIsIframeReady = 'ledger-is-iframe-ready' ,
23
21
LedgerConnectionChange = 'ledger-connection-change' ,
@@ -158,9 +156,12 @@ export class LedgerIframeBridge
158
156
}
159
157
160
158
async attemptMakeApp ( ) : Promise < boolean > {
161
- const response = await this . #sendMessage( {
162
- action : IFrameMessageAction . LedgerMakeApp ,
163
- } ) ;
159
+ const response = await this . #sendMessage(
160
+ {
161
+ action : IFrameMessageAction . LedgerMakeApp ,
162
+ } ,
163
+ { timeout : IFRAME_MESSAGE_TIMEOUT } ,
164
+ ) ;
164
165
165
166
if ( 'success' in response && response . success ) {
166
167
return true ;
@@ -177,10 +178,13 @@ export class LedgerIframeBridge
177
178
throw new Error ( 'The iframe is not loaded yet' ) ;
178
179
}
179
180
180
- const response = await this . #sendMessage( {
181
- action : IFrameMessageAction . LedgerUpdateTransport ,
182
- params : { transportType } ,
183
- } ) ;
181
+ const response = await this . #sendMessage(
182
+ {
183
+ action : IFrameMessageAction . LedgerUpdateTransport ,
184
+ params : { transportType } ,
185
+ } ,
186
+ { timeout : IFRAME_MESSAGE_TIMEOUT } ,
187
+ ) ;
184
188
185
189
if ( 'success' in response && response . success ) {
186
190
return true ;
@@ -192,11 +196,7 @@ export class LedgerIframeBridge
192
196
async getPublicKey (
193
197
params : GetPublicKeyParams ,
194
198
) : Promise < GetPublicKeyResponse > {
195
- return this . #deviceActionMessage(
196
- IFrameMessageAction . LedgerUnlock ,
197
- params ,
198
- USER_ACTION_REQUEST_TIMEOUT ,
199
- ) ;
199
+ return this . #deviceActionMessage( IFrameMessageAction . LedgerUnlock , params ) ;
200
200
}
201
201
202
202
async deviceSignTransaction (
@@ -205,7 +205,6 @@ export class LedgerIframeBridge
205
205
return this . #deviceActionMessage(
206
206
IFrameMessageAction . LedgerSignTransaction ,
207
207
params ,
208
- USER_ACTION_REQUEST_TIMEOUT ,
209
208
) ;
210
209
}
211
210
@@ -215,7 +214,6 @@ export class LedgerIframeBridge
215
214
return this . #deviceActionMessage(
216
215
IFrameMessageAction . LedgerSignPersonalMessage ,
217
216
params ,
218
- USER_ACTION_REQUEST_TIMEOUT ,
219
217
) ;
220
218
}
221
219
@@ -225,59 +223,42 @@ export class LedgerIframeBridge
225
223
return this . #deviceActionMessage(
226
224
IFrameMessageAction . LedgerSignTypedData ,
227
225
params ,
228
- USER_ACTION_REQUEST_TIMEOUT ,
229
226
) ;
230
227
}
231
228
232
229
async #deviceActionMessage(
233
230
action : IFrameMessageAction . LedgerUnlock ,
234
231
params : GetPublicKeyParams ,
235
- timeout : number ,
236
232
) : Promise < GetPublicKeyResponse > ;
237
233
238
234
async #deviceActionMessage(
239
235
action : IFrameMessageAction . LedgerSignTransaction ,
240
236
params : LedgerSignTransactionParams ,
241
- timeout : number ,
242
237
) : Promise < LedgerSignTransactionResponse > ;
243
238
244
239
async #deviceActionMessage(
245
240
action : IFrameMessageAction . LedgerSignPersonalMessage ,
246
241
params : LedgerSignMessageParams ,
247
- timeout : number ,
248
242
) : Promise < LedgerSignMessageResponse > ;
249
243
250
244
async #deviceActionMessage(
251
245
action : IFrameMessageAction . LedgerSignTypedData ,
252
246
params : LedgerSignTypedDataParams ,
253
- timeout : number ,
254
247
) : Promise < LedgerSignTypedDataResponse > ;
255
248
256
249
async #deviceActionMessage(
257
- ...[ action , params , timeout ] :
258
- | [ IFrameMessageAction . LedgerUnlock , GetPublicKeyParams , number ]
259
- | [
260
- IFrameMessageAction . LedgerSignTransaction ,
261
- LedgerSignTransactionParams ,
262
- number ,
263
- ]
264
- | [
265
- IFrameMessageAction . LedgerSignPersonalMessage ,
266
- LedgerSignMessageParams ,
267
- number ,
268
- ]
269
- | [
270
- IFrameMessageAction . LedgerSignTypedData ,
271
- LedgerSignTypedDataParams ,
272
- number ,
273
- ]
250
+ ...[ action , params ] :
251
+ | [ IFrameMessageAction . LedgerUnlock , GetPublicKeyParams ]
252
+ | [ IFrameMessageAction . LedgerSignTransaction , LedgerSignTransactionParams ]
253
+ | [ IFrameMessageAction . LedgerSignPersonalMessage , LedgerSignMessageParams ]
254
+ | [ IFrameMessageAction . LedgerSignTypedData , LedgerSignTypedDataParams ]
274
255
) : Promise <
275
256
| GetPublicKeyResponse
276
257
| LedgerSignTransactionResponse
277
258
| LedgerSignMessageResponse
278
259
| LedgerSignTypedDataResponse
279
260
> {
280
- const response = await this . #sendMessage( { action, params } , timeout ) ;
261
+ const response = await this . #sendMessage( { action, params } ) ;
281
262
282
263
if ( 'payload' in response && response . payload ) {
283
264
if ( 'success' in response && response . success ) {
@@ -338,7 +319,7 @@ export class LedgerIframeBridge
338
319
339
320
async #sendMessage< TAction extends IFrameMessageAction > (
340
321
message : IFrameMessage < TAction > ,
341
- timeout = IFRAME_MESSAGE_TIMEOUT ,
322
+ { timeout } : { timeout ?: number } = { } ,
342
323
) : Promise < IFrameMessageResponse > {
343
324
this . currentMessageId += 1 ;
344
325
@@ -360,14 +341,16 @@ export class LedgerIframeBridge
360
341
throw new Error ( 'The iframe is not loaded yet' ) ;
361
342
}
362
343
363
- setTimeout ( ( ) => {
364
- if ( this . #messageResponseHandles. has ( postMsg . messageId ) ) {
365
- this . #messageResponseHandles. delete ( postMsg . messageId ) ;
366
- messageResponseHandle . reject (
367
- new Error ( 'Ledger iframe message timeout' ) ,
368
- ) ;
369
- }
370
- } , timeout ) ;
344
+ if ( timeout ) {
345
+ setTimeout ( ( ) => {
346
+ if ( this . #messageResponseHandles. has ( postMsg . messageId ) ) {
347
+ this . #messageResponseHandles. delete ( postMsg . messageId ) ;
348
+ messageResponseHandle . reject (
349
+ new Error ( 'Ledger iframe message timeout' ) ,
350
+ ) ;
351
+ }
352
+ } , timeout ) ;
353
+ }
371
354
372
355
this . iframe . contentWindow . postMessage ( postMsg , '*' ) ;
373
356
0 commit comments