#pragma once
#include "JSDOMBinding.h"
#include "JSDOMConvert.h"
#include "JSDOMGuardedObject.h"
#include "JSReadableStream.h"
namespace WebCore {
class ReadableStreamSink;
class ReadableStreamSource;
class ReadableStream final : public DOMGuarded<JSReadableStream> {
public:
static Ref<ReadableStream> create(JSDOMGlobalObject& globalObject, JSReadableStream& readableStream) { return adoptRef(*new ReadableStream(globalObject, readableStream)); }
static Ref<ReadableStream> create(JSC::JSGlobalObject&, RefPtr<ReadableStreamSource>&&);
WEBCORE_EXPORT static bool isDisturbed(JSC::JSGlobalObject&, JSC::JSValue);
std::pair<Ref<ReadableStream>, Ref<ReadableStream>> tee();
void lock();
void pipeTo(ReadableStreamSink&);
bool isLocked() const;
bool isDisturbed() const;
JSReadableStream* readableStream() const { return guarded(); }
protected:
ReadableStream(JSDOMGlobalObject& globalObject, JSReadableStream& readableStream) : DOMGuarded<JSReadableStream>(globalObject, readableStream) { }
};
struct JSReadableStreamWrapperConverter {
static RefPtr<ReadableStream> toWrapped(JSC::JSGlobalObject& lexicalGlobalObject, JSC::JSValue value)
{
JSC::VM& vm = JSC::getVM(&lexicalGlobalObject);
auto* globalObject = JSC::jsDynamicCast<JSDOMGlobalObject*>(vm, &lexicalGlobalObject);
if (!globalObject)
return nullptr;
auto* readableStream = JSC::jsDynamicCast<JSReadableStream*>(vm, value);
if (!readableStream)
return nullptr;
return ReadableStream::create(*globalObject, *readableStream);
}
};
template<> struct JSDOMWrapperConverterTraits<ReadableStream> {
using WrapperClass = JSReadableStreamWrapperConverter;
using ToWrappedReturnType = RefPtr<ReadableStream>;
static constexpr bool needsState = true;
};
inline JSC::JSValue toJS(JSC::JSGlobalObject*, JSC::JSGlobalObject*, ReadableStream* stream)
{
return stream ? stream->readableStream() : JSC::jsUndefined();
}
}