uvco 0.1
Loading...
Searching...
No Matches
stream.h
Go to the documentation of this file.
1// uvco (c) 2023 Lewin Bormann. See LICENSE for specific terms.
2
3#pragma once
4
5#include <boost/assert.hpp>
6#include <fmt/core.h>
7#include <span>
8#include <uv.h>
9#include <uv/unix.h>
10
11#include "uvco/close.h"
13#include "uvco/loop/loop.h"
15#include "uvco/run.h"
16
17#include <coroutine>
18#include <cstdio>
19#include <memory>
20#include <optional>
21#include <string>
22#include <utility>
23
24namespace uvco {
25
28
31 struct ShutdownAwaiter_;
32 struct InStreamAwaiter_;
33 struct OutStreamAwaiter_;
34
35public:
36 template <typename Stream>
37 explicit StreamBase(std::unique_ptr<Stream> stream)
38 : stream_{(uv_stream_t *)stream.release()} {}
39 StreamBase(const StreamBase &) = delete;
40 StreamBase(StreamBase &&) = default;
41 StreamBase &operator=(const StreamBase &) = delete;
43
48 virtual ~StreamBase();
49
50 static constexpr size_t defaultMaxReadSize = 4080;
51
63 read(size_t maxSize = defaultMaxReadSize);
64
73 Promise<size_t> read(std::span<char> buffer);
74
88 [[nodiscard]] Promise<void> write(std::string buf);
89
92 [[nodiscard]] Promise<void> shutdown();
93
96 void close();
97
99 [[nodiscard]] const uv_stream_t *underlying() const { return stream_.get(); }
100
101 [[nodiscard]] uv_os_fd_t fd() const;
102
103protected:
104 uv_stream_t &stream() {
105 BOOST_ASSERT(stream_);
106 return *stream_;
107 }
109 BOOST_ASSERT(stream_);
110 stream_.reset();
111 }
112
113private:
114 std::unique_ptr<uv_stream_t, UvHandleDeleter> stream_;
115
116 // Currently suspended readers/writers to be notified on close().
117 std::coroutine_handle<> reader_;
118 std::coroutine_handle<> writer_;
119};
120
127class TtyStream : public StreamBase {
128public:
129 // Takes ownership of stream.
130 TtyStream(TtyStream &&other) = default;
131 TtyStream(const TtyStream &other) = delete;
133 TtyStream &operator=(const TtyStream &) = delete;
134 ~TtyStream() override = default;
135
136 static TtyStream tty(const Loop &loop, int fd);
137 static TtyStream stdin(const Loop &loop) { return tty(loop, 0); }
138 static TtyStream stdout(const Loop &loop) { return tty(loop, 1); }
139 static TtyStream stderr(const Loop &loop) { return tty(loop, 2); }
140
141private:
142 explicit TtyStream(std::unique_ptr<uv_tty_t> stream)
143 : StreamBase{std::move(stream)} {}
144};
145
147
148} // namespace uvco
Definition loop.h:26
Definition promise.h:49
Promise< void > shutdown()
Definition stream.cc:154
Promise< std::optional< std::string > > read(size_t maxSize=defaultMaxReadSize)
Definition stream.cc:105
static constexpr size_t defaultMaxReadSize
Definition stream.h:50
StreamBase & operator=(const StreamBase &)=delete
StreamBase(StreamBase &&)=default
uv_stream_t & stream()
Definition stream.h:104
StreamBase & operator=(StreamBase &&)=default
std::coroutine_handle reader_
Definition stream.h:117
const uv_stream_t * underlying() const
Return the underlying UV stream object.
Definition stream.h:99
virtual ~StreamBase()
Definition stream.cc:93
StreamBase(const StreamBase &)=delete
std::coroutine_handle writer_
Definition stream.h:118
Promise< void > write(std::string buf)
Definition stream.cc:123
void destroyStream()
Definition stream.h:108
StreamBase(std::unique_ptr< Stream > stream)
Definition stream.h:37
void close()
Definition stream.cc:170
uv_os_fd_t fd() const
Definition stream.cc:361
std::unique_ptr< uv_stream_t, UvHandleDeleter > stream_
Definition stream.h:114
TtyStream & operator=(TtyStream &&)=default
static TtyStream tty(const Loop &loop, int fd)
Definition stream.cc:95
TtyStream(TtyStream &&other)=default
TtyStream & operator=(const TtyStream &)=delete
~TtyStream() override=default
TtyStream(const TtyStream &other)=delete
TtyStream(std::unique_ptr< uv_tty_t > stream)
Definition stream.h:142
static TtyStream stdin(const Loop &loop)
Definition stream.h:137
static TtyStream stdout(const Loop &loop)
Definition stream.h:138
static TtyStream stderr(const Loop &loop)
Definition stream.h:139
Definition async_work.cc:18
Definition stream.cc:42
Definition stream.cc:30