@@ -16,8 +16,12 @@ protocol EthereumEventsDelegate: AnyObject {
16
16
public class Ethereum {
17
17
static let CONNECTION_ID = TimestampGenerator . timestamp ( )
18
18
static let BATCH_CONNECTION_ID = TimestampGenerator . timestamp ( )
19
+
19
20
var submittedRequests : [ String : SubmittedRequest ] = [ : ]
21
+ private let queue = DispatchQueue ( label: " submittedRequests.queue " )
22
+
20
23
private var cancellables : Set < AnyCancellable > = [ ]
24
+ private let cancellablesLock = NSRecursiveLock ( )
21
25
22
26
let readOnlyRPCProvider : ReadOnlyRPCProvider
23
27
@@ -85,7 +89,7 @@ public class Ethereum {
85
89
}
86
90
87
91
private func fetchCachedSession( ) {
88
- if
92
+ if
89
93
let account = store. string ( for: ACCOUNT_KEY) ,
90
94
let chainId = store. string ( for: CHAINID_KEY)
91
95
{
@@ -126,6 +130,42 @@ public class Ethereum {
126
130
appMetadata = metadata
127
131
commClient. appMetadata = metadata
128
132
}
133
+
134
+ func addRequest( _ submittedRequest: SubmittedRequest , id: String ) {
135
+ queue. async { [ weak self] in
136
+ self ? . submittedRequests [ id] = submittedRequest
137
+ }
138
+ }
139
+
140
+ func getAllRequests( ) -> [ String : SubmittedRequest ] {
141
+ return queue. sync { [ weak self] in
142
+ return self ? . submittedRequests ?? [ : ]
143
+ }
144
+ }
145
+
146
+ func getRequest( id: String ) -> SubmittedRequest ? {
147
+ return queue. sync { [ weak self] in
148
+ return self ? . submittedRequests [ id]
149
+ }
150
+ }
151
+
152
+ func removeRequest( id: String ) {
153
+ queue. async { [ weak self] in
154
+ self ? . submittedRequests. removeValue ( forKey: id)
155
+ }
156
+ }
157
+
158
+ func removeAllRequests( ) {
159
+ queue. async { [ weak self] in
160
+ self ? . submittedRequests. removeAll ( )
161
+ }
162
+ }
163
+
164
+ private func syncCancellables( ) -> Set < AnyCancellable > {
165
+ cancellablesLock. sync {
166
+ return cancellables
167
+ }
168
+ }
129
169
130
170
// MARK: Session Management
131
171
@@ -141,8 +181,8 @@ public class Ethereum {
141
181
}
142
182
143
183
let submittedRequest = SubmittedRequest ( method: " " )
144
- submittedRequests [ Ethereum . CONNECTION_ID] = submittedRequest
145
- let publisher = submittedRequests [ Ethereum . CONNECTION_ID] ? . publisher
184
+ addRequest ( submittedRequest , id : Ethereum . CONNECTION_ID)
185
+ let publisher = getRequest ( id : Ethereum . CONNECTION_ID) ? . publisher
146
186
147
187
return publisher
148
188
}
@@ -153,7 +193,7 @@ public class Ethereum {
153
193
}
154
194
155
195
return await withCheckedContinuation { continuation in
156
- publisher
196
+ let cancellable = publisher
157
197
. tryMap { output in
158
198
// remove nil and NSNUll values in result
159
199
if let resultArray = output as? [ Any ? ] {
@@ -182,7 +222,11 @@ public class Ethereum {
182
222
}
183
223
} , receiveValue: { result in
184
224
continuation. resume ( returning: . success( result) )
185
- } ) . store ( in: & cancellables)
225
+ } )
226
+
227
+ cancellablesLock. sync {
228
+ cancellables. insert ( cancellable)
229
+ }
186
230
}
187
231
}
188
232
@@ -216,8 +260,8 @@ public class Ethereum {
216
260
}
217
261
218
262
let submittedRequest = SubmittedRequest ( method: connectSignRequest. method)
219
- submittedRequests [ connectSignRequest. id] = submittedRequest
220
- let publisher = submittedRequests [ connectSignRequest. id] ? . publisher
263
+ addRequest ( submittedRequest , id : connectSignRequest. id)
264
+ let publisher = getRequest ( id : connectSignRequest. id) ? . publisher
221
265
222
266
commClient. connect ( with: requestJson)
223
267
@@ -262,8 +306,8 @@ public class Ethereum {
262
306
}
263
307
case . deeplinking:
264
308
let submittedRequest = SubmittedRequest ( method: connectWithRequest. method)
265
- submittedRequests [ connectWithRequest. id] = submittedRequest
266
- let publisher = submittedRequests [ connectWithRequest. id] ? . publisher
309
+ addRequest ( submittedRequest , id : connectWithRequest. id)
310
+ let publisher = getRequest ( id : connectWithRequest. id) ? . publisher
267
311
268
312
// React Native SDK has request params as Data
269
313
if let paramsData = req. params as? Data {
@@ -421,14 +465,14 @@ public class Ethereum {
421
465
422
466
func terminateConnection( ) {
423
467
if connected {
424
- track ? ( . connectionRejected , [ : ] )
468
+ track ? ( . connectionTerminated , [ : ] )
425
469
}
426
470
427
471
let error = RequestError ( from: [ " message " : " The connection request has been rejected " ] )
428
- submittedRequests . forEach { key, _ in
429
- submittedRequests [ key] ? . error ( error)
472
+ getAllRequests ( ) . forEach { key, _ in
473
+ getRequest ( id : key) ? . error ( error)
430
474
}
431
- submittedRequests . removeAll ( )
475
+ removeAllRequests ( )
432
476
clearSession ( )
433
477
}
434
478
@@ -534,8 +578,8 @@ public class Ethereum {
534
578
)
535
579
536
580
let submittedRequest = SubmittedRequest ( method: requestAccountsRequest. method)
537
- submittedRequests [ requestAccountsRequest. id] = submittedRequest
538
- let publisher = submittedRequests [ requestAccountsRequest. id] ? . publisher
581
+ addRequest ( submittedRequest , id : requestAccountsRequest. id)
582
+ let publisher = getRequest ( id : requestAccountsRequest. id) ? . publisher
539
583
540
584
commClient. addRequest { [ weak self] in
541
585
self ? . sendRequest ( requestAccountsRequest)
@@ -562,8 +606,9 @@ public class Ethereum {
562
606
} else {
563
607
let id = request. id
564
608
let submittedRequest = SubmittedRequest ( method: request. method)
565
- submittedRequests [ id] = submittedRequest
566
- let publisher = submittedRequests [ id] ? . publisher
609
+ addRequest ( submittedRequest, id: id)
610
+
611
+ let publisher = getRequest ( id: id) ? . publisher
567
612
568
613
if connected || !account. isEmpty {
569
614
connected = true
@@ -649,13 +694,13 @@ public class Ethereum {
649
694
}
650
695
651
696
func sendResult( _ result: Any , id: String ) {
652
- submittedRequests [ id ] ? . send ( result)
653
- submittedRequests . removeValue ( forKey : id)
697
+ getRequest ( id : id ) ? . send ( result)
698
+ removeRequest ( id : id)
654
699
}
655
700
656
701
func sendError( _ error: RequestError , id: String ) {
657
- submittedRequests [ id ] ? . error ( error)
658
- submittedRequests . removeValue ( forKey : id)
702
+ getRequest ( id : id ) ? . error ( error)
703
+ removeRequest ( id : id)
659
704
660
705
if error. codeType == . unauthorisedRequest {
661
706
clearSession ( )
@@ -676,7 +721,7 @@ public class Ethereum {
676
721
}
677
722
678
723
func receiveResponse( _ data: [ String : Any ] , id: String ) {
679
- guard let request = submittedRequests [ id ] else { return }
724
+ guard let request = getRequest ( id : id ) else { return }
680
725
681
726
track ? ( . sdkRpcRequestDone, [
682
727
" from " : " mobile " ,
0 commit comments