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
83 [[nodiscard]] Promise<size_t> write(std::string buf);
84
89 [[nodiscard]] Promise<size_t> writeBorrowed(std::span<const char> buf);
90
93 [[nodiscard]] Promise<void> shutdown();
94
97 void close();
98
100 [[nodiscard]] const uv_stream_t *underlying() const { return stream_.get(); }
101
102 [[nodiscard]] uv_os_fd_t fd() const;
103
104protected:
105 uv_stream_t &stream() {
106 BOOST_ASSERT(stream_);
107 return *stream_;
108 }
110 BOOST_ASSERT(stream_);
111 stream_.reset();
112 }
113
114private:
115 std::unique_ptr<uv_stream_t, UvHandleDeleter> stream_;
116
117 // Currently suspended readers/writers to be notified on close().
118 std::coroutine_handle<> reader_;
119 std::coroutine_handle<> writer_;
120};
121
128class TtyStream : public StreamBase {
129public:
130 // Takes ownership of stream.
131 TtyStream(TtyStream &&other) = default;
132 TtyStream(const TtyStream &other) = delete;
134 TtyStream &operator=(const TtyStream &) = delete;
135 ~TtyStream() override = default;
136
137 static TtyStream tty(const Loop &loop, int fd);
138 static TtyStream stdin(const Loop &loop) { return tty(loop, 0); }
139 static TtyStream stdout(const Loop &loop) { return tty(loop, 1); }
140 static TtyStream stderr(const Loop &loop) { return tty(loop, 2); }
141
142private:
143 explicit TtyStream(std::unique_ptr<uv_tty_t> stream)
144 : StreamBase{std::move(stream)} {}
145};
146
148
149} // namespace uvco
Definition loop.h:26
Definition promise.h:49
Promise< void > shutdown()
Definition stream.cc:144
Promise< std::optional< std::string > > read(size_t maxSize=defaultMaxReadSize)
Definition stream.cc:96
static constexpr size_t defaultMaxReadSize
Definition stream.h:50
StreamBase & operator=(const StreamBase &)=delete
StreamBase(StreamBase &&)=default
uv_stream_t & stream()
Definition stream.h:105
StreamBase & operator=(StreamBase &&)=default
std::coroutine_handle reader_
Definition stream.h:118
const uv_stream_t * underlying() const
Return the underlying UV stream object.
Definition stream.h:100
virtual ~StreamBase()
Definition stream.cc:84
Promise< size_t > write(std::string buf)
Definition stream.cc:114
StreamBase(const StreamBase &)=delete
std::coroutine_handle writer_
Definition stream.h:119
Promise< size_t > writeBorrowed(std::span< const char > buf)
Definition stream.cc:118
void destroyStream()
Definition stream.h:109
StreamBase(std::unique_ptr< Stream > stream)
Definition stream.h:37
void close()
Definition stream.cc:155
uv_os_fd_t fd() const
Definition stream.cc:343
std::unique_ptr< uv_stream_t, UvHandleDeleter > stream_
Definition stream.h:115
TtyStream & operator=(TtyStream &&)=default
static TtyStream tty(const Loop &loop, int fd)
Definition stream.cc:86
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:143
static TtyStream stdin(const Loop &loop)
Definition stream.h:138
static TtyStream stdout(const Loop &loop)
Definition stream.h:139
static TtyStream stderr(const Loop &loop)
Definition stream.h:140
Definition async_work.cc:18
Definition stream.cc:40
Definition stream.cc:28