ReadableJSStream.h [plain text]
#ifndef ReadableJSStream_h
#define ReadableJSStream_h
#if ENABLE(STREAMS_API)
#include "ReadableStream.h"
#include <heap/Strong.h>
#include <heap/StrongInlines.h>
#include <runtime/JSCJSValue.h>
#include <runtime/PrivateName.h>
#include <wtf/Deque.h>
#include <wtf/Ref.h>
namespace JSC {
class JSFunction;
class JSPromise;
}
namespace WebCore {
class JSDOMGlobalObject;
class ReadableStreamController;
typedef int ExceptionCode;
class ReadableJSStream: public ReadableStream {
public:
static RefPtr<ReadableJSStream> create(JSC::ExecState&, JSC::JSValue, const Dictionary&);
JSC::JSValue jsController(JSC::ExecState&, JSDOMGlobalObject*);
void close(ExceptionCode&);
void storeError(JSC::ExecState&, JSC::JSValue);
JSC::JSValue error() override { return m_error.get(); }
void enqueue(JSC::ExecState&, JSC::JSValue);
void error(JSC::ExecState&, JSC::JSValue, ExceptionCode&);
double desiredSize() const { return m_highWaterMark - m_totalQueueSize; }
private:
ReadableJSStream(JSC::ExecState&, JSC::JSObject*, double, JSC::JSFunction*);
void doStart(JSC::ExecState&);
JSC::JSPromise* invoke(JSC::ExecState&, const char*, JSC::JSValue parameter);
void storeException(JSC::ExecState&);
virtual bool hasEnoughValues() const override { return desiredSize() <= 0; }
virtual bool hasValue() const override;
virtual JSC::JSValue read() override;
virtual bool doPull() override;
virtual bool doCancel(JSC::JSValue) override;
JSDOMGlobalObject* globalObject();
double retrieveChunkSize(JSC::ExecState&, JSC::JSValue);
std::unique_ptr<ReadableStreamController> m_controller;
JSC::Strong<JSC::Unknown> m_error;
JSC::Strong<JSC::JSFunction> m_errorFunction;
JSC::Strong<JSC::JSObject> m_source;
struct Chunk {
JSC::Strong<JSC::Unknown> value;
double size;
};
Deque<Chunk> m_chunkQueue;
double m_totalQueueSize { 0 };
double m_highWaterMark;
JSC::Strong<JSC::JSFunction> m_sizeFunction;
};
}
#endif // ENABLE(STREAMS_API)
#endif // ReadableJSStream_h