ReadableStreamSource.h [plain text]
#pragma once
#if ENABLE(STREAMS_API)
#include "JSDOMPromise.h"
#include "ReadableStreamController.h"
#include <wtf/Optional.h>
namespace WebCore {
typedef int ExceptionCode;
class ReadableStreamSource : public RefCounted<ReadableStreamSource> {
public:
virtual ~ReadableStreamSource() { }
typedef DOMPromise<std::nullptr_t> Promise;
virtual void firstReadCallback() { }
void start(ReadableStreamController&&, Promise&&);
void cancel(JSC::JSValue);
bool isStarting() const { return !!m_startPromise; }
protected:
ReadableStreamController& controller() { return m_controller.value(); }
const ReadableStreamController& controller() const { return m_controller.value(); }
void startFinished();
void cancelFinished();
void clean();
virtual void setActive() = 0;
virtual void setInactive() = 0;
virtual void doStart() { startFinished(); }
virtual void doCancel() { }
private:
Optional<Promise> m_startPromise;
Optional<ReadableStreamController> m_controller;
};
inline void ReadableStreamSource::start(ReadableStreamController&& controller, Promise&& promise)
{
m_startPromise = WTFMove(promise);
m_controller = WTFMove(controller);
setActive();
doStart();
}
inline void ReadableStreamSource::startFinished()
{
ASSERT(m_startPromise);
std::exchange(m_startPromise, Nullopt).value().resolve(nullptr);
setInactive();
}
inline void ReadableStreamSource::cancel(JSC::JSValue)
{
clean();
doCancel();
}
inline void ReadableStreamSource::clean()
{
if (m_startPromise) {
m_startPromise = Nullopt;
setInactive();
}
}
}
#endif // ENABLE(STREAMS_API)