Skip to content

Commit fa92fc5

Browse files
committed
fix(services): move streaming to own managed channel; drop dead connections on app resume
Signed-off-by: Brandon McAnsh <git@bmcreations.dev>
1 parent cfff436 commit fa92fc5

17 files changed

Lines changed: 145 additions & 33 deletions

File tree

services/flipcash/src/main/kotlin/com/flipcash/services/internal/network/api/ActivityFeedApi.kt

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -15,9 +15,10 @@ import com.getcode.opencode.model.core.ID
1515
import io.grpc.ManagedChannel
1616
import kotlinx.coroutines.Dispatchers
1717
import kotlinx.coroutines.withContext
18-
import java.util.concurrent.TimeUnit
1918
import javax.inject.Inject
19+
import javax.inject.Singleton
2020

21+
@Singleton
2122
internal class ActivityFeedApi @Inject constructor(
2223
@FlipcashManagedChannel
2324
managedChannel: ManagedChannel,

services/flipcash/src/main/kotlin/com/flipcash/services/internal/network/api/EmailVerificationApi.kt

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,9 @@ import io.grpc.ManagedChannel
1212
import kotlinx.coroutines.Dispatchers
1313
import kotlinx.coroutines.withContext
1414
import javax.inject.Inject
15+
import javax.inject.Singleton
1516

17+
@Singleton
1618
internal class EmailVerificationApi @Inject constructor(
1719
@FlipcashManagedChannel
1820
managedChannel: ManagedChannel,

services/flipcash/src/main/kotlin/com/flipcash/services/internal/network/api/PhoneVerificationApi.kt

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,9 @@ import io.grpc.ManagedChannel
1313
import kotlinx.coroutines.Dispatchers
1414
import kotlinx.coroutines.withContext
1515
import javax.inject.Inject
16+
import javax.inject.Singleton
1617

18+
@Singleton
1719
internal class PhoneVerificationApi @Inject constructor(
1820
@FlipcashManagedChannel
1921
managedChannel: ManagedChannel,

services/flipcash/src/main/kotlin/com/flipcash/services/internal/network/api/ProfileApi.kt

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -13,10 +13,11 @@ import com.getcode.opencode.internal.network.core.GrpcApi
1313
import com.getcode.opencode.model.core.ID
1414
import io.grpc.ManagedChannel
1515
import kotlinx.coroutines.Dispatchers
16-
import kotlinx.coroutines.flow.flowOn
1716
import kotlinx.coroutines.withContext
1817
import javax.inject.Inject
18+
import javax.inject.Singleton
1919

20+
@Singleton
2021
internal class ProfileApi @Inject constructor(
2122
@FlipcashManagedChannel
2223
managedChannel: ManagedChannel,

services/flipcash/src/main/kotlin/com/flipcash/services/internal/network/api/PushApi.kt

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,9 @@ import kotlinx.coroutines.Dispatchers
1414
import kotlinx.coroutines.withContext
1515
import java.util.concurrent.TimeUnit
1616
import javax.inject.Inject
17+
import javax.inject.Singleton
1718

19+
@Singleton
1820
internal class PushApi @Inject constructor(
1921
@FlipcashManagedChannel
2022
managedChannel: ManagedChannel,

services/flipcash/src/main/kotlin/com/flipcash/services/internal/network/api/ThirdPartyApi.kt

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,9 @@ import io.grpc.ManagedChannel
1212
import kotlinx.coroutines.Dispatchers
1313
import kotlinx.coroutines.withContext
1414
import javax.inject.Inject
15+
import javax.inject.Singleton
1516

17+
@Singleton
1618
internal class ThirdPartyApi @Inject constructor(
1719
@FlipcashManagedChannel
1820
managedChannel: ManagedChannel,

services/opencode/src/main/kotlin/com/getcode/opencode/RepositoryFactory.kt

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -137,7 +137,10 @@ object RepositoryFactory {
137137
OpenCodeModule::class.java,
138138
)
139139

140-
val api = CurrencyApi(module.provideManagedChannel(context, config))
140+
val api = CurrencyApi(
141+
managedChannel = module.provideManagedChannel(context, config),
142+
streamingChannel = module.provideManagedStreamingChannel(context, config)
143+
)
141144
val mintMapper = MintMapper(
142145
vmMetadataMapper = VmMetadataMapper(),
143146
launchpadMetadataMapper = LaunchpadMetadataMapper(),

services/opencode/src/main/kotlin/com/getcode/opencode/inject/OpenCodeModule.kt

Lines changed: 25 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@ import com.getcode.opencode.controllers.TokenController
99
import com.getcode.opencode.controllers.TransactionController
1010
import com.getcode.opencode.exchange.Exchange
1111
import com.getcode.opencode.internal.annotations.OpenCodeManagedChannel
12+
import com.getcode.opencode.internal.annotations.OpenCodeManagedStreamingChannel
1213
import com.getcode.opencode.internal.annotations.OpenCodeProtocol
1314
import com.getcode.opencode.internal.domain.repositories.InternalAccountRepository
1415
import com.getcode.opencode.internal.domain.repositories.InternalCurrencyRepository
@@ -44,6 +45,8 @@ import io.grpc.android.AndroidChannelBuilder
4445
import org.kin.sdk.base.network.api.agora.OkHttpChannelBuilderForcedTls12
4546
import java.util.concurrent.TimeUnit
4647
import javax.inject.Singleton
48+
import kotlin.time.Duration
49+
import kotlin.time.Duration.Companion.seconds
4750

4851
@InstallIn(SingletonComponent::class)
4952
@Module
@@ -89,8 +92,28 @@ object OpenCodeModule {
8992
.usingBuilder(OkHttpChannelBuilderForcedTls12.forAddress(config.baseUrl, config.port))
9093
.context(context)
9194
.userAgent(config.userAgent)
92-
.keepAliveTime(config.keepAlive.inWholeMilliseconds, TimeUnit.MILLISECONDS)
93-
.keepAliveTimeout(config.keepAliveTimeout.inWholeMilliseconds, TimeUnit.MILLISECONDS)
95+
.keepAliveWithoutCalls(false)
96+
.idleTimeout(5, TimeUnit.MINUTES) // drop idle connections
97+
.apply {
98+
if (BuildConfig.DEBUG) {
99+
this.intercept(LoggingClientInterceptor())
100+
}
101+
}
102+
.build()
103+
}
104+
105+
@Singleton
106+
@Provides
107+
@OpenCodeManagedStreamingChannel
108+
fun provideManagedStreamingChannel(
109+
@ApplicationContext context: Context,
110+
@OpenCodeProtocol
111+
config: ProtocolConfig,
112+
): ManagedChannel {
113+
return AndroidChannelBuilder
114+
.usingBuilder(OkHttpChannelBuilderForcedTls12.forAddress(config.baseUrl, config.port))
115+
.context(context)
116+
.userAgent(config.userAgent)
94117
.keepAliveWithoutCalls(true)
95118
.apply {
96119
if (BuildConfig.DEBUG) {

services/opencode/src/main/kotlin/com/getcode/opencode/internal/annotations/OpenCodeManagedChannel.kt

Lines changed: 12 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,4 +10,15 @@ import javax.inject.Qualifier
1010
AnnotationTarget.VALUE_PARAMETER,
1111
AnnotationTarget.FIELD
1212
)
13-
internal annotation class OpenCodeManagedChannel
13+
internal annotation class OpenCodeManagedChannel
14+
15+
16+
@Qualifier
17+
@Target(
18+
AnnotationTarget.FUNCTION,
19+
AnnotationTarget.PROPERTY_GETTER,
20+
AnnotationTarget.PROPERTY_SETTER,
21+
AnnotationTarget.VALUE_PARAMETER,
22+
AnnotationTarget.FIELD
23+
)
24+
internal annotation class OpenCodeManagedStreamingChannel

services/opencode/src/main/kotlin/com/getcode/opencode/internal/network/api/CurrencyApi.kt

Lines changed: 12 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -3,28 +3,35 @@ package com.getcode.opencode.internal.network.api
33
import com.codeinc.opencode.gen.currency.v1.CurrencyGrpcKt
44
import com.codeinc.opencode.gen.currency.v1.CurrencyService
55
import com.getcode.opencode.internal.annotations.OpenCodeManagedChannel
6+
import com.getcode.opencode.internal.annotations.OpenCodeManagedStreamingChannel
7+
import com.getcode.opencode.internal.model.WindowedRange
68
import com.getcode.opencode.internal.network.core.GrpcApi
7-
import com.getcode.opencode.internal.network.extensions.asProtobufTimestamp
89
import com.getcode.opencode.internal.network.extensions.asSolanaAccountId
910
import com.getcode.opencode.model.financial.CurrencyCode
10-
import com.getcode.opencode.internal.model.WindowedRange
1111
import com.getcode.solana.keys.Mint
1212
import com.getcode.solana.keys.PublicKey
1313
import io.grpc.ManagedChannel
14-
import io.grpc.stub.StreamObserver
1514
import kotlinx.coroutines.Dispatchers
1615
import kotlinx.coroutines.flow.Flow
1716
import kotlinx.coroutines.withContext
1817
import javax.inject.Inject
18+
import javax.inject.Singleton
1919

20+
@Singleton
2021
internal class CurrencyApi @Inject constructor(
2122
@OpenCodeManagedChannel
2223
managedChannel: ManagedChannel,
23-
) : GrpcApi(managedChannel) {
24+
25+
@OpenCodeManagedStreamingChannel
26+
streamingChannel: ManagedChannel,
27+
) : GrpcApi(managedChannel, streamingChannel) {
2428

2529
private val api = CurrencyGrpcKt.CurrencyCoroutineStub(managedChannel)
2630
.withWaitForReady()
2731

32+
private val streamingApi = CurrencyGrpcKt.CurrencyCoroutineStub(streamingChannel)
33+
.withWaitForReady()
34+
2835
/**
2936
* Gets mint account metadata by address
3037
*
@@ -73,6 +80,6 @@ internal class CurrencyApi @Inject constructor(
7380
fun streamLiveMintData(
7481
requests: Flow<CurrencyService.StreamLiveMintDataRequest>
7582
): Flow<CurrencyService.StreamLiveMintDataResponse> {
76-
return api.streamLiveMintData(requests)
83+
return streamingApi.streamLiveMintData(requests)
7784
}
7885
}

0 commit comments

Comments
 (0)