@@ -60,6 +60,8 @@ import {
60
60
select ,
61
61
race ,
62
62
spawn ,
63
+ delay ,
64
+ actionChannel ,
63
65
} from 'redux-saga/effects' ;
64
66
import { eventChannel } from 'redux-saga' ;
65
67
import { get , values } from 'lodash' ;
@@ -177,9 +179,9 @@ function* init() {
177
179
// Refresh redux with the active sessions, loaded from storage
178
180
// Pass extend = true so session expiration date get renewed
179
181
yield call ( refreshActiveSessions , true ) ;
180
-
181
- yield fork ( listenForNetworkChange ) ;
182
182
yield fork ( listenForAppStateChange ) ;
183
+ yield fork ( listenForNetworkChange ) ;
184
+ yield fork ( requestsListener ) ;
183
185
184
186
// If the wallet is reset, we should cancel all listeners
185
187
yield take ( types . RESET_WALLET ) ;
@@ -221,6 +223,7 @@ export function* checkForPendingRequests() {
221
223
const { web3wallet } = yield select ( ( state ) => state . walletConnect . client ) ;
222
224
223
225
yield call ( [ web3wallet , web3wallet . getPendingAuthRequests ] ) ;
226
+ yield call ( [ web3wallet , web3wallet . getPendingSessionRequests ] ) ;
224
227
}
225
228
226
229
export function * refreshActiveSessions ( extend = false ) {
@@ -327,11 +330,26 @@ export function* clearSessions() {
327
330
yield call ( refreshActiveSessions ) ;
328
331
}
329
332
333
+ function * requestsListener ( ) {
334
+ const requestsChannel = yield actionChannel ( 'WC_SESSION_REQUEST' ) ;
335
+
336
+ let action ;
337
+ while ( true ) {
338
+ try {
339
+ action = yield take ( requestsChannel ) ;
340
+ yield call ( processRequest , action ) ;
341
+ } catch ( error ) {
342
+ log . error ( 'Error processing request.' , error ) ;
343
+ yield put ( onExceptionCaptured ( error ) ) ;
344
+ }
345
+ }
346
+ }
347
+
330
348
/**
331
349
* This saga will be called (dispatched from the event listener) when a session
332
350
* is requested from a dApp
333
351
*/
334
- export function * onSessionRequest ( action ) {
352
+ export function * processRequest ( action ) {
335
353
const { payload } = action ;
336
354
const { params } = payload ;
337
355
@@ -402,7 +420,7 @@ export function* onSessionRequest(action) {
402
420
if ( retry ) {
403
421
shouldAnswer = false ;
404
422
// Retry the action, exactly as it came:
405
- yield spawn ( onSessionRequest , action ) ;
423
+ yield * processRequest ( action ) ;
406
424
}
407
425
} break ;
408
426
case CreateTokenError : {
@@ -418,7 +436,7 @@ export function* onSessionRequest(action) {
418
436
if ( retry ) {
419
437
shouldAnswer = false ;
420
438
// Retry the action, exactly as it came:
421
- yield spawn ( onSessionRequest , action ) ;
439
+ yield * processRequest ( action ) ;
422
440
}
423
441
} break ;
424
442
default :
@@ -911,7 +929,6 @@ export function* saga() {
911
929
takeLatest ( types . SHOW_SIGN_MESSAGE_REQUEST_MODAL , onSignMessageRequest ) ,
912
930
takeLatest ( types . SHOW_SIGN_ORACLE_DATA_REQUEST_MODAL , onSignOracleDataRequest ) ,
913
931
takeLatest ( types . SHOW_CREATE_TOKEN_REQUEST_MODAL , onCreateTokenRequest ) ,
914
- takeLeading ( 'WC_SESSION_REQUEST' , onSessionRequest ) ,
915
932
takeEvery ( 'WC_SESSION_PROPOSAL' , onSessionProposal ) ,
916
933
takeEvery ( 'WC_SESSION_DELETE' , onSessionDelete ) ,
917
934
takeEvery ( 'WC_CANCEL_SESSION' , onCancelSession ) ,
0 commit comments