public static CompositeObjectReader reader(S3ObjectMetadata objectMetadata, ObjectStorage objectStorage) {
        return new CompositeObjectReader(
            objectMetadata,
            (readOptions, metadata, startOffset, endOffset) ->
                objectStorage.rangeRead(
                    new ObjectStorage.ReadOptions().bucket(metadata.bucket()).throttleStrategy(readOptions.throttleStrategy()),
                    metadata.key(), startOffset, endOffset)
        );
    }
CompositeObject is a logic object which soft links multiple objects together.
<p>
v0 format:
objects
object_count u32
objects (
object_id u64
block_start_index u32
bucket_index u16
)*
indexes
index_count u32
(
stream_id u64
start_offset u64
end_offset_delta u32
record_count u32
block_start_position u64
block_size u32
)*
index_handle
position u64
length u32
padding 40byte - 8 - 8 - 4
magic u64
s3stream/src/main/java/com/automq/stream/s3/CompositeObject.java