Skip to content

Commit 855a77a

Browse files
authored
refactor(rt)!: update SDK I/O abstractions (#751)
1 parent b495397 commit 855a77a

File tree

147 files changed

+5515
-6112
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

147 files changed

+5515
-6112
lines changed
Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
{
2+
"id": "54b5e8b9-394c-4235-b66c-6b912fdb106b",
3+
"type": "misc",
4+
"description": "**BREAKING** Refactor SDK I/O types. See [this discussion post](https://github.com/awslabs/aws-sdk-kotlin/discussions/768) for more information"
5+
}

docs/design/binary-streaming.md

Lines changed: 148 additions & 125 deletions
Large diffs are not rendered by default.

gradle.properties

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@ kotlin.native.ignoreDisabledTargets=true
66
kotlin.mpp.enableCompatibilityMetadataVariant=true
77

88
# SDK
9-
sdkVersion=0.13.2-SNAPSHOT
9+
sdkVersion=0.14.0-SNAPSHOT
1010

1111
# kotlin
1212
kotlinVersion=1.7.10
@@ -19,6 +19,7 @@ atomicFuVersion=0.18.3
1919
kotlinxSerializationVersion=1.3.3
2020
jsoupVersion=1.14.3
2121
okHttpVersion=5.0.0-alpha.10
22+
okioVersion=3.2.0
2223

2324
# codegen
2425
smithyVersion=1.26.1
@@ -43,4 +44,4 @@ kotlinLoggingVersion=2.1.21
4344
slf4jVersion=1.7.36
4445

4546
# crt
46-
crtKotlinVersion=0.6.6
47+
crtKotlinVersion=0.6.6

runtime/auth/aws-signing-common/common/src/aws/smithy/kotlin/runtime/auth/awssigning/AbstractAwsChunkedByteReadChannel.kt

Lines changed: 0 additions & 206 deletions
This file was deleted.

runtime/auth/aws-signing-common/common/src/aws/smithy/kotlin/runtime/auth/awssigning/AwsChunkedByteReadChannel.kt

Lines changed: 41 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,9 @@
55

66
package aws.smithy.kotlin.runtime.auth.awssigning
77

8+
import aws.smithy.kotlin.runtime.auth.awssigning.internal.AwsChunkedReader
89
import aws.smithy.kotlin.runtime.http.Headers
10+
import aws.smithy.kotlin.runtime.io.SdkBuffer
911
import aws.smithy.kotlin.runtime.io.SdkByteReadChannel
1012
import aws.smithy.kotlin.runtime.util.InternalApi
1113

@@ -14,17 +16,48 @@ import aws.smithy.kotlin.runtime.util.InternalApi
1416
* This class wraps an SdkByteReadChannel. When reads are performed on this class, it will read the wrapped data
1517
* and return it in aws-chunked content encoding.
1618
* @see <a href="https://docs.aws.amazon.com/AmazonS3/latest/API/sigv4-streaming.html">SigV4 Streaming</a>
17-
* @param chan the underlying [SdkByteReadChannel] which will have its data encoded in aws-chunked format
19+
* @param delegate the underlying [SdkByteReadChannel] which will have its data encoded in aws-chunked format
1820
* @param signer the signer to use to sign chunks and (optionally) chunk trailer
1921
* @param signingConfig the config to use for signing
2022
* @param previousSignature the previous signature to use for signing. in most cases, this should be the seed signature
2123
* @param trailingHeaders the optional trailing headers to include in the final chunk
2224
*/
2325
@InternalApi
24-
public expect class AwsChunkedByteReadChannel public constructor(
25-
chan: SdkByteReadChannel,
26-
signer: AwsSigner,
27-
signingConfig: AwsSigningConfig,
28-
previousSignature: ByteArray,
29-
trailingHeaders: Headers = Headers.Empty,
30-
) : AbstractAwsChunkedByteReadChannel
26+
public class AwsChunkedByteReadChannel(
27+
private val delegate: SdkByteReadChannel,
28+
private val signer: AwsSigner,
29+
private val signingConfig: AwsSigningConfig,
30+
private var previousSignature: ByteArray,
31+
private val trailingHeaders: Headers = Headers.Empty,
32+
) : SdkByteReadChannel by delegate {
33+
34+
private val chunkReader = AwsChunkedReader(
35+
delegate.asStream(),
36+
signer,
37+
signingConfig,
38+
previousSignature,
39+
trailingHeaders,
40+
)
41+
42+
override val isClosedForRead: Boolean
43+
get() = chunkReader.chunk.size == 0L && chunkReader.hasLastChunkBeenSent && delegate.isClosedForRead
44+
45+
override val availableForRead: Int
46+
get() = chunkReader.chunk.size.toInt() + delegate.availableForRead
47+
48+
override suspend fun read(sink: SdkBuffer, limit: Long): Long {
49+
require(limit >= 0L) { "Invalid limit ($limit) must be >= 0L" }
50+
if (!chunkReader.ensureValidChunk()) return -1L
51+
return chunkReader.chunk.read(sink, limit)
52+
}
53+
}
54+
55+
private fun SdkByteReadChannel.asStream(): AwsChunkedReader.Stream = object : AwsChunkedReader.Stream {
56+
private val delegate = this@asStream
57+
58+
override fun isClosedForRead(): Boolean =
59+
delegate.isClosedForRead
60+
61+
override suspend fun read(sink: SdkBuffer, limit: Long): Long =
62+
delegate.read(sink, limit)
63+
}

0 commit comments

Comments
 (0)