|
18 | 18 | #include <memory> |
19 | 19 | #include <vector> |
20 | 20 |
|
| 21 | +#include "../quic/streams.h" |
| 22 | + |
21 | 23 | namespace node { |
22 | 24 |
|
23 | 25 | using v8::ArrayBufferView; |
@@ -1061,9 +1063,81 @@ class FdEntry final : public EntryImpl { |
1061 | 1063 | friend class ReaderImpl; |
1062 | 1064 | }; |
1063 | 1065 |
|
| 1066 | +} // namespace |
| 1067 | +// ============================================================================ |
| 1068 | + |
| 1069 | +class FeederEntry final : public EntryImpl { |
| 1070 | + public: |
| 1071 | + FeederEntry(DataQueueFeeder* feeder) : feeder_(feeder) { |
| 1072 | + } |
| 1073 | + |
| 1074 | + static std::unique_ptr<FeederEntry> Create(DataQueueFeeder* feeder) { |
| 1075 | + return std::make_unique<FeederEntry>(feeder); |
| 1076 | + } |
| 1077 | + |
| 1078 | + std::shared_ptr<DataQueue::Reader> get_reader() override { |
| 1079 | + return ReaderImpl::Create(this); |
| 1080 | + } |
| 1081 | + |
| 1082 | + std::unique_ptr<Entry> slice( |
| 1083 | + uint64_t start, std::optional<uint64_t> end = std::nullopt) override { |
| 1084 | + // we are not idempotent |
| 1085 | + return std::unique_ptr<Entry>(nullptr); |
| 1086 | + } |
| 1087 | + |
| 1088 | + std::optional<uint64_t> size() const override { |
| 1089 | + return std::optional<uint64_t>(); |
| 1090 | + } |
| 1091 | + |
| 1092 | + bool is_idempotent() const override { return false; } |
| 1093 | + |
| 1094 | + SET_NO_MEMORY_INFO() |
| 1095 | + SET_MEMORY_INFO_NAME(FeederEntry) |
| 1096 | + SET_SELF_SIZE(FeederEntry) |
| 1097 | + |
| 1098 | + private: |
| 1099 | + DataQueueFeeder* feeder_; |
| 1100 | + |
| 1101 | + class ReaderImpl final : public DataQueue::Reader, |
| 1102 | + public std::enable_shared_from_this<ReaderImpl> { |
| 1103 | + public: |
| 1104 | + static std::shared_ptr<ReaderImpl> Create(FeederEntry* entry) { |
| 1105 | + return std::make_shared<ReaderImpl>(entry); |
| 1106 | + }; |
| 1107 | + |
| 1108 | + explicit ReaderImpl(FeederEntry* entry) : entry_(entry) { |
| 1109 | + } |
| 1110 | + |
| 1111 | + ~ReaderImpl() { |
| 1112 | + entry_->feeder_->DrainAndClose(); |
| 1113 | + } |
| 1114 | + |
| 1115 | + int Pull(Next next, |
| 1116 | + int options, |
| 1117 | + DataQueue::Vec* data, |
| 1118 | + size_t count, |
| 1119 | + size_t max_count_hint = bob::kMaxCountHint) override { |
| 1120 | + if (entry_->feeder_->Done()) { |
| 1121 | + std::move(next)(bob::STATUS_EOS, nullptr, 0, [](uint64_t) {}); |
| 1122 | + return bob::STATUS_EOS; |
| 1123 | + } |
| 1124 | + entry_->feeder_->addPendingPull( |
| 1125 | + DataQueueFeeder::PendingPull(std::move(next))); |
| 1126 | + entry_->feeder_->tryWakePulls(); |
| 1127 | + return bob::STATUS_WAIT; |
| 1128 | + } |
| 1129 | + |
| 1130 | + SET_NO_MEMORY_INFO() |
| 1131 | + SET_MEMORY_INFO_NAME(FeederEntry::Reader) |
| 1132 | + SET_SELF_SIZE(ReaderImpl) |
| 1133 | + |
| 1134 | + private: |
| 1135 | + FeederEntry* entry_; |
| 1136 | + }; |
| 1137 | +}; |
| 1138 | + |
1064 | 1139 | // ============================================================================ |
1065 | 1140 |
|
1066 | | -} // namespace |
1067 | 1141 |
|
1068 | 1142 | std::shared_ptr<DataQueue> DataQueue::CreateIdempotent( |
1069 | 1143 | std::vector<std::unique_ptr<Entry>> list) { |
@@ -1137,6 +1211,11 @@ std::unique_ptr<DataQueue::Entry> DataQueue::CreateFdEntry(Environment* env, |
1137 | 1211 | return FdEntry::Create(env, path); |
1138 | 1212 | } |
1139 | 1213 |
|
| 1214 | +std::unique_ptr<DataQueue::Entry> DataQueue::CreateFeederEntry( |
| 1215 | + DataQueueFeeder* feeder) { |
| 1216 | + return FeederEntry::Create(feeder); |
| 1217 | +} |
| 1218 | + |
1140 | 1219 | void DataQueue::Initialize(Environment* env, v8::Local<v8::Object> target) { |
1141 | 1220 | // Nothing to do here currently. |
1142 | 1221 | } |
|
0 commit comments