<lambda>null1 package host.exp.exponent.kernel
2 
3 import expo.modules.manifests.core.Manifest
4 import host.exp.exponent.RNObject
5 import okhttp3.Interceptor
6 import okhttp3.Response
7 
8 /**
9  * A singleton network interceptor proxy to forward okhttp requests to the versioned handlers.
10  */
11 object KernelNetworkInterceptor {
12   private var sdkVersion: String = RNObject.UNVERSIONED
13   private var versionedAppInterceptorObject: RNObject? = null
14   private var versionedNetworkInterceptorObject: RNObject? = null
15   private var expoNetworkInterceptor: RNObject? = null
16 
17   fun start(manifest: Manifest, reactInstanceManager: Any?) {
18     sdkVersion = manifest.getExpoGoSDKVersion() ?: throw IllegalArgumentException("Invalid SDK version")
19     val sdkMajorVersion = sdkVersion.split(".")[0].toIntOrNull() ?: Int.MAX_VALUE
20     if (sdkMajorVersion < 49) {
21       return
22     }
23     versionedAppInterceptorObject = RNObject("expo.modules.kotlin.devtools.ExpoNetworkInspectOkHttpAppInterceptor")
24       .loadVersion(sdkVersion)
25       .construct()
26     versionedNetworkInterceptorObject = RNObject("expo.modules.kotlin.devtools.ExpoNetworkInspectOkHttpNetworkInterceptor")
27       .loadVersion(sdkVersion)
28       .construct()
29     expoNetworkInterceptor = RNObject("host.exp.exponent.ExpoNetworkInterceptor")
30       .loadVersion(sdkVersion)
31       .construct()
32     expoNetworkInterceptor?.call("start", manifest, reactInstanceManager)
33   }
34 
35   val okhttpAppInterceptorProxy = Interceptor { chain ->
36     versionedAppInterceptorObject?.callWithThrowable("intercept", chain) as? Response
37       ?: chain.proceed(chain.request())
38   }
39 
40   val okhttpNetworkInterceptorProxy = Interceptor { chain ->
41     versionedNetworkInterceptorObject?.callWithThrowable("intercept", chain) as? Response
42       ?: chain.proceed(chain.request())
43   }
44 
45   fun onResume(reactInstanceManager: Any?) {
46     expoNetworkInterceptor?.call("onResume", reactInstanceManager)
47   }
48 
49   fun onPause() {
50     expoNetworkInterceptor?.call("onPause")
51     versionedNetworkInterceptorObject = null
52     versionedAppInterceptorObject = null
53   }
54 }
55