Skip to content

Commit

Permalink
LibWeb: Use Vector<ByteBuffer> to store chunks in ReadLoopReadRequest
Browse files Browse the repository at this point in the history
This stores the incoming chunks into a Vector of ByteBuffer in order to
be able to retrieve them in the same order as they came in.
  • Loading branch information
kennethmyhra authored and awesomekling committed Apr 7, 2024
1 parent cb5f30a commit 12cfa08
Show file tree
Hide file tree
Showing 2 changed files with 10 additions and 6 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -86,7 +86,7 @@ void ReadLoopReadRequest::on_chunk(JS::Value chunk)
auto const& buffer = array.viewed_array_buffer()->buffer();

// 2. Append the bytes represented by chunk to bytes.
m_bytes.append(buffer);
m_byte_chunks.append(buffer);

// FIXME: As the spec suggests, implement this non-recursively - instead of directly. It is not too big of a deal currently
// as we enqueue the entire blob buffer in one go, meaning that we only recurse a single time. Once we begin queuing
Expand All @@ -104,7 +104,7 @@ void ReadLoopReadRequest::on_chunk(JS::Value chunk)
void ReadLoopReadRequest::on_close()
{
// 1. Call successSteps with bytes.
m_success_steps(m_bytes);
m_success_steps(m_byte_chunks);
}

// error steps, given e
Expand Down Expand Up @@ -206,8 +206,12 @@ WebIDL::ExceptionOr<JS::NonnullGCPtr<WebIDL::Promise>> ReadableStreamDefaultRead

auto promise = WebIDL::create_promise(realm);

auto success_steps = [promise, &realm](ByteBuffer bytes) {
auto buffer = JS::ArrayBuffer::create(realm, move(bytes));
auto success_steps = [promise, &realm](Vector<ByteBuffer> const& byte_chunks) {
ByteBuffer concatenated_byte_chunks;
for (auto const& chunk : byte_chunks)
concatenated_byte_chunks.append(chunk);

auto buffer = JS::ArrayBuffer::create(realm, move(concatenated_byte_chunks));
WebIDL::resolve_promise(realm, promise, buffer);
};

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -36,7 +36,7 @@ class ReadLoopReadRequest final : public ReadRequest {

public:
// successSteps, which is an algorithm accepting a byte sequence
using SuccessSteps = JS::SafeFunction<void(ByteBuffer)>;
using SuccessSteps = JS::SafeFunction<void(Vector<ByteBuffer> const&)>;

// failureSteps, which is an algorithm accepting a JavaScript value
using FailureSteps = JS::SafeFunction<void(JS::Value error)>;
Expand All @@ -55,7 +55,7 @@ class ReadLoopReadRequest final : public ReadRequest {
JS::VM& m_vm;
JS::NonnullGCPtr<JS::Realm> m_realm;
JS::NonnullGCPtr<ReadableStreamDefaultReader> m_reader;
ByteBuffer m_bytes;
Vector<ByteBuffer> m_byte_chunks;
SuccessSteps m_success_steps;
FailureSteps m_failure_steps;
};
Expand Down

0 comments on commit 12cfa08

Please sign in to comment.