janvladimirmostert
12/18/2020, 4:44 PMoutputStream.use { out -> baos.writeTo(out) }
diesieben07
12/18/2020, 5:06 PMcopyTo
already copies in chunks (it has a bufferSize
parameter). Or what do you mean by "chunked"?janvladimirmostert
12/18/2020, 5:15 PMpublic synchronized void writeTo(OutputStream out) throws IOException {
out.write(this.buf, 0, this.count);
}
Kinda looking for something where I can yield inbetween each chunk to prevent a Blocking.IO coroutine from being hogged if somebody has a very slow internet connection
outputStream.use { out ->
baos.window(BufferSize) { chunk ->
chunk.writeTo(out)
yield()
}
}diesieben07
12/18/2020, 5:19 PMByteArrayInputStream(baos.toByteArray()).use {
it.copyTo(output)
}
diesieben07
12/18/2020, 5:20 PMjanvladimirmostert
12/18/2020, 5:21 PMjanvladimirmostert
12/18/2020, 5:22 PMjanvladimirmostert
12/18/2020, 5:24 PMval buffer = ByteArray(DEFAULT_BUFFER_SIZE)
val yieldSize: Int = 1 * 1024 * 1024
var bytesCopied = 0L
var bytesAfterYield = 0L
this.respondOutputStream {
this.use { output ->
ByteArrayInputStream(result.data?.toByteArray() ?: byteArrayOf()).use { input ->
while (true) {
val bytes = input.read(buffer).takeIf { it >= 0 } ?: break
<http://LulaServer.log.info|LulaServer.log.info>("[${result.fileName}] writing: $bytes")
output.write(buffer)
if (bytesAfterYield >= yieldSize) {
yield()
bytesAfterYield %= yieldSize
}
bytesCopied += bytes
bytesAfterYield += bytes
}
}
}
}