This commit is contained in:
Jarred Sumner
2024-12-26 17:20:41 -08:00
parent 243b087b6d
commit cfcef4be53
4 changed files with 110 additions and 20 deletions

View File

@@ -150,10 +150,10 @@ JSPromise* JSReadableStream::pipeTo(VM& vm, JSGlobalObject* globalObject, JSObje
return nullptr;
}
bool preventClose = false;
bool preventAbort = false;
bool preventCancel = false;
JSObject* signal = nullptr;
bool preventClose [[maybe_unused]] = false;
bool preventAbort [[maybe_unused]] = false;
bool preventCancel [[maybe_unused]] = false;
JSObject* signal [[maybe_unused]] = nullptr;
if (!options.isUndefined()) {
JSObject* optionsObject = options.toObject(globalObject);
@@ -192,11 +192,12 @@ JSPromise* JSReadableStream::pipeTo(VM& vm, JSGlobalObject* globalObject, JSObje
auto* reader = JSReadableStreamDefaultReader::create(vm, globalObject, streams.structure<JSReadableStreamDefaultReader>(domGlobalObject), this);
m_reader.set(vm, this, reader);
auto* writer = JSWritableStreamDefaultWriter::create(vm, streams.structure<JSWritableStreamDefaultWriter>(domGlobalObject), writableStream);
auto* writer [[maybe_unused]] = JSWritableStreamDefaultWriter::create(vm, streams.structure<JSWritableStreamDefaultWriter>(domGlobalObject), writableStream);
JSPromise* promise = JSPromise::create(vm, globalObject->promiseStructure());
auto* pipeToOperation = PipeToOperation::create(vm, globalObject, reader, writer, preventClose, preventAbort, preventCancel, signal, promise);
pipeToOperation->perform(vm, globalObject);
// auto* pipeToOperation = PipeToOperation::create(vm, globalObject, reader, writer, preventClose, preventAbort, preventCancel, signal, promise);
// pipeToOperation->perform(vm, globalObject);
// promise->reject(globalObject, )
return promise;
}
@@ -254,8 +255,8 @@ void JSReadableStream::tee(VM& vm, JSGlobalObject* globalObject, JSValue& firstS
Structure* streamStructure = streams.structure<JSReadableStream>(domGlobalObject);
auto* stream1 = JSReadableStream::create(vm, globalObject, streamStructure);
auto* stream2 = JSReadableStream::create(vm, globalObject, streamStructure);
stream1->error(error);
stream2->error(error);
stream1->error(globalObject, error);
stream2->error(globalObject, error);
firstStream = stream1;
secondStream = stream2;
return;
@@ -293,4 +294,59 @@ void JSReadableStream::visitChildrenImpl(JSCell* cell, Visitor& visitor)
DEFINE_VISIT_CHILDREN(JSReadableStream);
bool JSReadableStream::isLocked() const
{
return locked();
}
JSReadableStream* JSReadableStream::create(JSC::VM& vm, JSC::JSGlobalObject* globalObject, JSC::Structure* structure)
{
JSReadableStream* stream = new (NotNull, allocateCell<JSReadableStream>(vm)) JSReadableStream(vm, structure);
stream->finishCreation(vm);
return stream;
}
JSReadableStream::JSReadableStream(VM& vm, Structure* structure)
: Base(vm, structure)
{
}
void JSReadableStream::finishCreation(VM& vm)
{
Base::finishCreation(vm);
m_state = State::Readable;
m_disturbed = false;
}
Structure* JSReadableStream::createStructure(VM& vm, JSGlobalObject* globalObject, JSValue prototype)
{
return Structure::create(vm, globalObject, prototype, TypeInfo(ObjectType, StructureFlags), info());
}
void JSReadableStream::close(JSGlobalObject* globalObject)
{
m_state = State::Closed;
if (auto* reader = this->reader())
reader->closedPromise()->resolve(globalObject, jsUndefined());
}
void JSReadableStream::error(JSGlobalObject* globalObject, JSValue error)
{
VM& vm = globalObject->vm();
m_state = State::Errored;
m_storedError.set(vm, this, error.toObject(globalObject));
if (auto* reader = this->reader())
reader->closedPromise()->reject(globalObject, error);
}
void JSReadableStream::setReader(JSReadableStreamDefaultReader* reader)
{
if (reader) {
VM& vm = reader->vm();
m_reader.set(vm, this, reader);
} else {
m_reader.clear();
}
}
}

View File

@@ -54,7 +54,7 @@ public:
JSC::JSValue pipeThrough(VM&, JSGlobalObject*, JSObject* transform, JSValue options = jsUndefined());
void tee(VM&, JSGlobalObject*, JSValue& firstStream, JSValue& secondStream);
void error(JSValue);
void error(JSGlobalObject*, JSValue);
void close(JSGlobalObject*);
void setReader(JSReadableStreamDefaultReader*);

View File

@@ -129,7 +129,7 @@ void JSReadableStreamDefaultController::error(VM& vm, JSGlobalObject* globalObje
m_cancelAlgorithm.clear();
m_strategySizeAlgorithm.clear();
stream->error(error);
stream->error(globalObject, error);
}
void JSReadableStreamDefaultController::close(VM& vm, JSGlobalObject* globalObject)

View File

@@ -1,3 +1,4 @@
#pragma once
#include "root.h"
@@ -8,15 +9,48 @@ namespace Bun {
class JSReadableStreamDefaultReader;
class JSWritableStreamDefaultWriter;
class PipeToOperation : public JSC::JSInternalFieldObjectImpl<5> {
public:
static constexpr unsigned numberOfInternalFields = 5;
using Base = JSC::JSInternalFieldObjectImpl<numberOfInternalFields>;
static PipeToOperation* create(JSC::VM& vm, JSC::JSGlobalObject* globalObject,
JSReadableStreamDefaultReader* reader, JSWritableStreamDefaultWriter* writer,
bool preventClose, bool preventAbort, bool preventCancel, JSC::JSObject* signal, JSC::JSPromise* promise);
// class PipeToOperation : public JSC::JSInternalFieldObjectImpl<7> {
// public:
// static constexpr unsigned numberOfInternalFields = 7;
// using Base = JSC::JSInternalFieldObjectImpl<numberOfInternalFields>;
// static PipeToOperation* create(JSC::VM& vm, JSC::JSGlobalObject* globalObject,
// JSC::JSObject* reader, JSC::JSObject* writer,
// bool preventClose, bool preventAbort, bool preventCancel, JSC::JSObject* signal, JSC::JSPromise* promise)
// {
// PipeToOperation* operation = new (NotNull, JSC::allocateCell<PipeToOperation>(vm)) PipeToOperation(vm, globalObject);
// operation->finishCreation(vm, reader, writer, preventClose, preventAbort, preventCancel, signal, promise);
// return operation;
// }
void perform(JSC::VM& vm, JSC::JSGlobalObject* globalObject) {}
};
// void perform(JSC::VM& vm, JSC::JSGlobalObject* globalObject) {}
// bool preventClose { false };
// bool preventAbort { false };
// bool preventCancel { false };
// mutable JSC::WriteBarrier<JSC::JSObject> reader;
// mutable JSC::WriteBarrier<JSC::JSObject> writer;
// mutable JSC::WriteBarrier<JSC::JSObject> signal;
// mutable JSC::WriteBarrier<JSC::JSPromise> promise;
// private:
// PipeToOperation(JSC::VM& vm, JSC::JSGlobalObject* globalObject)
// : Base(vm, globalObject)
// {
// }
// void finishCreation(JSC::VM& vm, JSC::JSObject* reader, JSC::JSObject* writer,
// bool preventClose, bool preventAbort, bool preventCancel, JSC::JSObject* signal, JSC::JSPromise* promise)
// {
// Base::finishCreation(vm);
// internalField(0).set(vm, this, reader);
// internalField(1).set(vm, this, writer);
// internalField(2).set(vm, this, JSC::jsBoolean(preventClose));
// internalField(3).set(vm, this, JSC::jsBoolean(preventAbort));
// internalField(4).set(vm, this, JSC::jsBoolean(preventCancel));
// internalField(5).set(vm, this, signal ? signal : JSC::jsUndefined());
// internalField(6).set(vm, this, promise);
// }
// };
}