Skip to content

Commit 39c68df

Browse files
committed
Use mutex for TokenAwareTwitchApiClient
1 parent 4aa6559 commit 39c68df

1 file changed

Lines changed: 27 additions & 14 deletions

File tree

Lines changed: 27 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,8 @@
11
package failchat.twitch
22

33
import failchat.chat.badge.ImageBadge
4-
import mu.KLogging
4+
import kotlinx.coroutines.sync.Mutex
5+
import kotlinx.coroutines.sync.withLock
56

67
/**
78
* The [TwitchApiClient] wrapper that:
@@ -14,41 +15,53 @@ class TokenAwareTwitchApiClient(
1415
private val tokenContainer: HelixTokenContainer
1516
) {
1617

17-
private companion object : KLogging()
18+
private val mutex = Mutex() // forbid parallel execution to prevent multiple tokens generation in the same time
1819

1920
suspend fun getUserId(userName: String): Long {
20-
return doWithRetryOnAuthError(twitchApiClient, clientSecret, tokenContainer) {
21-
twitchApiClient.getUserId(userName, it)
21+
return mutex.withLock {
22+
doWithRetryOnAuthError(twitchApiClient, clientSecret, tokenContainer) {
23+
twitchApiClient.getUserId(userName, it)
24+
}
2225
}
2326
}
2427

2528
suspend fun getViewersCount(userName: String): Int {
26-
return doWithRetryOnAuthError(twitchApiClient, clientSecret, tokenContainer) {
27-
twitchApiClient.getViewersCount(userName, it)
29+
return mutex.withLock {
30+
doWithRetryOnAuthError(twitchApiClient, clientSecret, tokenContainer) {
31+
twitchApiClient.getViewersCount(userName, it)
32+
}
2833
}
2934
}
3035

3136
suspend fun getGlobalEmoticons(): List<TwitchEmoticon> {
32-
return doWithRetryOnAuthError(twitchApiClient, clientSecret, tokenContainer) {
33-
twitchApiClient.getGlobalEmoticons(it)
37+
return mutex.withLock {
38+
doWithRetryOnAuthError(twitchApiClient, clientSecret, tokenContainer) {
39+
twitchApiClient.getGlobalEmoticons(it)
40+
}
3441
}
3542
}
3643

3744
suspend fun getFirstLiveChannelName(): String {
38-
return doWithRetryOnAuthError(twitchApiClient, clientSecret, tokenContainer) {
39-
twitchApiClient.getFirstLiveChannelName(it)
45+
return mutex.withLock {
46+
doWithRetryOnAuthError(twitchApiClient, clientSecret, tokenContainer) {
47+
twitchApiClient.getFirstLiveChannelName(it)
48+
}
4049
}
4150
}
4251

4352
suspend fun getGlobalBadges(): Map<TwitchBadgeId, ImageBadge> {
44-
return doWithRetryOnAuthError(twitchApiClient, clientSecret, tokenContainer) {
45-
twitchApiClient.getGlobalBadges(it)
53+
return mutex.withLock {
54+
doWithRetryOnAuthError(twitchApiClient, clientSecret, tokenContainer) {
55+
twitchApiClient.getGlobalBadges(it)
56+
}
4657
}
4758
}
4859

4960
suspend fun getChannelBadges(channelId: Long): Map<TwitchBadgeId, ImageBadge> {
50-
return doWithRetryOnAuthError(twitchApiClient, clientSecret, tokenContainer) {
51-
twitchApiClient.getChannelBadges(channelId, it)
61+
return mutex.withLock {
62+
doWithRetryOnAuthError(twitchApiClient, clientSecret, tokenContainer) {
63+
twitchApiClient.getChannelBadges(channelId, it)
64+
}
5265
}
5366
}
5467
}

0 commit comments

Comments
 (0)