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