1/*
2 * Copyright (C) 2016 Canon Inc.
3 *
4 * Redistribution and use in source and binary forms, with or without
5 * modification, are permitted, provided that the following conditions
6 * are required to be met:
7 *
8 * 1. Redistributions of source code must retain the above copyright
9 * notice, this list of conditions and the following disclaimer.
10 * 2. Redistributions in binary form must reproduce the above copyright
11 * notice, this list of conditions and the following disclaimer in the
12 * documentation and/or other materials provided with the distribution.
13 * 3. Neither the name of Canon Inc. nor the names of
14 * its contributors may be used to endorse or promote products derived
15 * from this software without specific prior written permission.
16 *
17 * THIS SOFTWARE IS PROVIDED BY CANON INC. AND ITS CONTRIBUTORS "AS IS" AND ANY
18 * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
19 * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
20 * DISCLAIMED. IN NO EVENT SHALL CANON INC. AND ITS CONTRIBUTORS BE LIABLE FOR
21 * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
22 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
23 * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
24 * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
25 * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
26 * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
27 */
28
29#pragma once
30
31#if ENABLE(STREAMS_API)
32
33#include "JSDOMPromiseDeferred.h"
34#include "ReadableStreamDefaultController.h"
35#include <wtf/Optional.h>
36
37namespace WebCore {
38
39class ReadableStreamSource : public RefCounted<ReadableStreamSource> {
40public:
41 virtual ~ReadableStreamSource() = default;
42
43 void start(ReadableStreamDefaultController&&, DOMPromiseDeferred<void>&&);
44 void pull(DOMPromiseDeferred<void>&&);
45 void cancel(JSC::JSValue);
46
47 bool isPulling() const { return !!m_promise; }
48
49protected:
50 ReadableStreamDefaultController& controller() { return m_controller.value(); }
51 const ReadableStreamDefaultController& controller() const { return m_controller.value(); }
52
53 void startFinished();
54 void pullFinished();
55 void cancelFinished();
56 void clean();
57
58 virtual void setActive() = 0;
59 virtual void setInactive() = 0;
60
61 virtual void doStart() = 0;
62 virtual void doPull() = 0;
63 virtual void doCancel() = 0;
64
65private:
66 Optional<DOMPromiseDeferred<void>> m_promise;
67 Optional<ReadableStreamDefaultController> m_controller;
68};
69
70inline void ReadableStreamSource::start(ReadableStreamDefaultController&& controller, DOMPromiseDeferred<void>&& promise)
71{
72 ASSERT(!m_promise);
73 m_promise = WTFMove(promise);
74 m_controller = WTFMove(controller);
75
76 setActive();
77 doStart();
78}
79
80inline void ReadableStreamSource::pull(DOMPromiseDeferred<void>&& promise)
81{
82 ASSERT(!m_promise);
83 ASSERT(m_controller);
84
85 m_promise = WTFMove(promise);
86
87 setActive();
88 doPull();
89}
90
91inline void ReadableStreamSource::startFinished()
92{
93 ASSERT(m_promise);
94 std::exchange(m_promise, WTF::nullopt).value().resolve();
95 setInactive();
96}
97
98inline void ReadableStreamSource::pullFinished()
99{
100 ASSERT(m_promise);
101 std::exchange(m_promise, WTF::nullopt).value().resolve();
102 setInactive();
103}
104
105inline void ReadableStreamSource::cancel(JSC::JSValue)
106{
107 clean();
108 doCancel();
109}
110
111inline void ReadableStreamSource::clean()
112{
113 if (m_promise) {
114 m_promise = WTF::nullopt;
115 setInactive();
116 }
117}
118
119} // namespace WebCore
120
121#endif // ENABLE(STREAMS_API)
122