@@ -3,11 +3,14 @@ package com.pega.constellation.sdk.kmp.engine.webview.ios
33import com.pega.constellation.sdk.kmp.core.Log
44import kotlinx.cinterop.ObjCSignatureOverride
55import kotlinx.coroutines.CoroutineScope
6+ import kotlinx.coroutines.Dispatchers
7+ import kotlinx.coroutines.IO
68import kotlinx.coroutines.Job
79import kotlinx.coroutines.isActive
810import kotlinx.coroutines.launch
911import platform.Foundation.NSData
1012import platform.Foundation.NSError
13+ import platform.Foundation.NSLock
1114import platform.Foundation.NSLocalizedDescriptionKey
1215import platform.Foundation.NSURLRequest
1316import platform.Foundation.NSURLResponse
@@ -26,6 +29,7 @@ class ResourceHandler(
2629 val mainScope : () -> CoroutineScope
2730) : NSObject(), WKURLSchemeHandlerProtocol {
2831 lateinit var delegate: ResourceHandlerDelegate
32+ private val tasksLock = NSLock ()
2933 private val tasks = mutableMapOf<NSURLRequest , Job >()
3034
3135 private suspend fun send (request : NSURLRequest ): Pair <NSData , NSURLResponse > {
@@ -37,7 +41,7 @@ class ResourceHandler(
3741 webView : WKWebView ,
3842 startURLSchemeTask : WKURLSchemeTaskProtocol
3943 ) {
40- mainScope().launch {
44+ mainScope().launch( Dispatchers . IO ) {
4145 try {
4246 Log .i(TAG , " Starting WKURLScheme task. <${startURLSchemeTask.request.URL } >" )
4347 val (data, response) = send(startURLSchemeTask.request)
@@ -46,7 +50,7 @@ class ResourceHandler(
4650 return @launch
4751 }
4852 Log .i(TAG , " WKURLScheme task is finished. <${startURLSchemeTask.request.URL } >" )
49- tasks.remove(startURLSchemeTask.request)
53+ tasksLock.withLock { tasks.remove(startURLSchemeTask.request) }
5054 startURLSchemeTask.didReceiveResponse(response)
5155 startURLSchemeTask.didReceiveData(data)
5256 startURLSchemeTask.didFinish()
@@ -59,7 +63,7 @@ class ResourceHandler(
5963 startURLSchemeTask.didFailWithError(e.toNSError())
6064 }
6165 }.let { job ->
62- tasks[startURLSchemeTask.request] = job
66+ tasksLock.withLock { tasks[startURLSchemeTask.request] = job }
6367 }
6468 }
6569
@@ -69,8 +73,19 @@ class ResourceHandler(
6973 stopURLSchemeTask : WKURLSchemeTaskProtocol
7074 ) {
7175 Log .i(TAG , " Stopping WKURLScheme task. <${stopURLSchemeTask.request.URL } >" )
72- tasks[stopURLSchemeTask.request]?.cancel()
73- tasks.remove(stopURLSchemeTask.request)
76+ tasksLock.withLock {
77+ tasks[stopURLSchemeTask.request]?.cancel()
78+ tasks.remove(stopURLSchemeTask.request)
79+ }
80+ }
81+ }
82+
83+ private inline fun <T > NSLock.withLock (block : () -> T ): T {
84+ lock()
85+ try {
86+ return block()
87+ } finally {
88+ unlock()
7489 }
7590}
7691private fun Throwable.toNSError (): NSError {
0 commit comments