@@ -47,57 +47,52 @@ internal class HordeGenerationRemoteDataSource(
4747 ?.let (hordeApi::cancelRequest)
4848 ? : Completable .error(Throwable (" No cached request id" ))
4949
50- private fun executeRequestChain (request : HordeGenerationAsyncRequest ): Single <String > {
51- val observableChain = hordeApi
52- .generateAsync(request)
53- .flatMapObservable { asyncStartResponse ->
54- statusSource.id = asyncStartResponse.id
55- asyncStartResponse.id?.let { id ->
56- val pingObs = Observable
57- .fromSingle(hordeApi.checkGeneration(id))
58- .flatMap { pingResponse ->
59- if (pingResponse.isPossible == false ) {
60- return @flatMap Observable .error(Throwable (" Response is not possible" ))
61- }
62- if (pingResponse.done == true ) {
63- return @flatMap Observable .fromSingle(hordeApi.checkStatus(id))
64- }
65- statusSource.update(
66- HordeProcessStatus (
67- waitTimeSeconds = pingResponse.waitTime ? : 0 ,
68- queuePosition = pingResponse.queuePosition,
69- )
70- )
71- return @flatMap Observable .error(RetryException ())
50+ private fun executeRequestChain (request : HordeGenerationAsyncRequest ) = hordeApi
51+ .generateAsync(request)
52+ .flatMapObservable { asyncStartResponse ->
53+ statusSource.id = asyncStartResponse.id
54+ asyncStartResponse.id?.let { id ->
55+ Observable
56+ .fromSingle(hordeApi.checkGeneration(id))
57+ .flatMap { pingResponse ->
58+ if (pingResponse.isPossible == false ) {
59+ return @flatMap Observable .error(Throwable (" Response is not possible" ))
60+ }
61+ if (pingResponse.done == true ) {
62+ return @flatMap Observable .fromSingle(hordeApi.checkStatus(id))
7263 }
73- .retryWhen { obs ->
74- obs.flatMap { t ->
75- if (t is RetryException ) {
76- return @flatMap Observable
77- .timer(HORDE_SOCKET_PING_TIME_SECONDS , TimeUnit .SECONDS )
78- .doOnNext {
79- debugLog(" Retrying HORDE status check..." )
80- }
64+ statusSource.update(
65+ HordeProcessStatus (
66+ waitTimeSeconds = pingResponse.waitTime ? : 0 ,
67+ queuePosition = pingResponse.queuePosition,
68+ )
69+ )
70+ return @flatMap Observable .error(RetryException ())
71+ }
72+ .retryWhen { obs ->
73+ obs.flatMap { t ->
74+ if (t is RetryException ) Observable
75+ .timer(HORDE_SOCKET_PING_TIME_SECONDS , TimeUnit .SECONDS )
76+ .doOnNext {
77+ debugLog(" Retrying HORDE status check..." )
8178 }
82- return @flatMap Observable .error(t)
83- }
79+ else
80+ Observable .error(t)
8481 }
82+ }
83+ } ? : Observable .error(Throwable (" Horde returned null generation id" ))
84+ }
85+ .flatMapSingle {
86+ it.generations?.firstOrNull()?.let { generation ->
87+ val bytes = URL (generation.img).readBytes()
88+ val bitmap = BitmapFactory .decodeByteArray(bytes, 0 , bytes.size)
89+ Single .just(bitmap)
90+ } ? : Single .error(Throwable (" Error extracting image" ))
91+ }
92+ .flatMapSingle { converter(BitmapToBase64Converter .Input (it)) }
93+ .map { it.base64ImageString }
94+ .let { Single .fromObservable(it) }
8595
86- pingObs
87- } ? : Observable .error(Throwable (" Horde returned null generation id" ))
88- }
89- .flatMapSingle {
90- it.generations?.firstOrNull()?.let { generation ->
91- val bytes = URL (generation.img).readBytes()
92- val bitmap = BitmapFactory .decodeByteArray(bytes, 0 , bytes.size)
93- Single .just(bitmap)
94- } ? : Single .error(Throwable (" Error extracting image" ))
95- }
96- .flatMapSingle { converter(BitmapToBase64Converter .Input (it)) }
97- .map { it.base64ImageString }
98-
99- return Single .fromObservable(observableChain)
100- }
10196
10297 private class RetryException : Throwable ()
10398
0 commit comments