Skip to content

Commit a6f9e16

Browse files
feat: support concurrent chunk uploads
1 parent 0456ab3 commit a6f9e16

1 file changed

Lines changed: 18 additions & 10 deletions

File tree

library/src/main/java/io/appwrite/Client.kt

Lines changed: 18 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -35,6 +35,7 @@ import java.security.SecureRandom
3535
import java.security.cert.X509Certificate
3636
import java.util.concurrent.atomic.AtomicInteger
3737
import java.util.concurrent.atomic.AtomicLong
38+
import java.util.concurrent.atomic.AtomicReference
3839
import javax.net.ssl.SSLContext
3940
import javax.net.ssl.SSLSocketFactory
4041
import javax.net.ssl.TrustManager
@@ -590,7 +591,7 @@ class Client @JvmOverloads constructor(
590591
responseType = Map::class.java
591592
)
592593

593-
if (index == 0 || uploadId == null) {
594+
if (index == 0) {
594595
uploadId = chunkResult["\$id"].toString()
595596
}
596597

@@ -624,6 +625,9 @@ class Client @JvmOverloads constructor(
624625
val nextChunk = AtomicInteger(0)
625626
val completedChunks = AtomicInteger((offset / CHUNK_SIZE).toInt())
626627
val uploadedBytes = AtomicLong(offset.coerceAtMost(size))
628+
val completedResultRef = AtomicReference<Map<*, *>?>(null)
629+
val lastResultRef = AtomicReference(result)
630+
val progressLock = Any()
627631

628632
coroutineScope {
629633
List(MAX_CONCURRENT_UPLOADS.coerceAtMost(chunks.size)) {
@@ -640,23 +644,27 @@ class Client @JvmOverloads constructor(
640644
val chunksUploaded = completedChunks.incrementAndGet()
641645
val sizeUploaded = uploadedBytes.addAndGet(end - start)
642646

647+
lastResultRef.set(chunkResult)
643648
if (isUploadComplete(chunkResult)) {
644-
result = chunkResult
649+
completedResultRef.set(chunkResult)
645650
}
646651

647-
onProgress?.invoke(
648-
UploadProgress(
649-
id = uploadId ?: chunkResult["\$id"].toString(),
650-
progress = sizeUploaded.coerceAtMost(size).toDouble() / size * 100,
651-
sizeUploaded = sizeUploaded.coerceAtMost(size),
652-
chunksTotal = chunkResult["chunksTotal"].toString().toInt(),
653-
chunksUploaded = chunksUploaded,
652+
synchronized(progressLock) {
653+
onProgress?.invoke(
654+
UploadProgress(
655+
id = uploadId ?: chunkResult["\$id"].toString(),
656+
progress = sizeUploaded.coerceAtMost(size).toDouble() / size * 100,
657+
sizeUploaded = sizeUploaded.coerceAtMost(size),
658+
chunksTotal = chunkResult["chunksTotal"].toString().toInt(),
659+
chunksUploaded = chunksUploaded,
660+
)
654661
)
655-
)
662+
}
656663
}
657664
}
658665
}.awaitAll()
659666
}
667+
result = completedResultRef.get() ?: lastResultRef.get()
660668
}
661669

662670
return converter(result as Map<String, Any>)

0 commit comments

Comments
 (0)