Reads the complete contents of an object from reader. This function may
read more bytes than required from reader, so the reader position after
returning is not reliable.
fn readObjectRaw(allocator: Allocator, reader: *Io.Reader, size: u64) ![]u8
fn readObjectRaw(allocator: Allocator, reader: *Io.Reader, size: u64) ![]u8 {
const alloc_size = std.math.cast(usize, size) orelse return error.ObjectTooLarge;
var aw: Io.Writer.Allocating = .init(allocator);
try aw.ensureTotalCapacity(alloc_size + std.compress.flate.max_window_len);
defer aw.deinit();
var decompress: std.compress.flate.Decompress = .init(reader, .zlib, &.{});
try decompress.reader.streamExact(&aw.writer, alloc_size);
return aw.toOwnedSlice();
}