Skip to content
This repository was archived by the owner on Oct 23, 2024. It is now read-only.

Commit 802a126

Browse files
authored
Check readable data after ondata handler is assigned. (#1074)
* Check readable data after ondata handler is assigned. If signaling data is arrived before ondata handler is assigned, it will not fire ondata again since OnCanRead is not called when readable queue is not empty. * Check readable data in ondata setter.
1 parent 357b000 commit 802a126

File tree

3 files changed

+34
-1
lines changed

3 files changed

+34
-1
lines changed

source/agent/addons/quic/QuicTransportStream.cc

Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -58,6 +58,7 @@ QuicTransportStream::~QuicTransportStream()
5858
}
5959
m_stream->SetVisitor(nullptr);
6060
delete[] m_buffer;
61+
m_onDataCallback.Reset();
6162
}
6263

6364
void QuicTransportStream::OnCanRead()
@@ -123,6 +124,7 @@ NAN_MODULE_INIT(QuicTransportStream::init)
123124
Nan::SetPrototypeMethod(tpl, "readTrackId", readTrackId);
124125
Nan::SetPrototypeMethod(tpl, "addDestination", addDestination);
125126
Nan::SetAccessor(instanceTpl, Nan::New("isMedia").ToLocalChecked(), isMediaGetter, isMediaSetter);
127+
Nan::SetAccessor(instanceTpl, Nan::New("ondata").ToLocalChecked(), onDataGetter, onDataSetter);
126128

127129
s_constructor.Reset(Nan::GetFunction(tpl).ToLocalChecked());
128130
Nan::Set(target, Nan::New("QuicTransportStream").ToLocalChecked(), Nan::GetFunction(tpl).ToLocalChecked());
@@ -203,6 +205,13 @@ NAN_METHOD(QuicTransportStream::readTrackId){
203205
obj->ReadTrackId();
204206
}
205207

208+
void QuicTransportStream::CheckReadableData()
209+
{
210+
if (m_stream->ReadableBytes() > 0) {
211+
SignalOnData();
212+
}
213+
}
214+
206215
NAN_GETTER(QuicTransportStream::isMediaGetter){
207216
QuicTransportStream* obj = Nan::ObjectWrap::Unwrap<QuicTransportStream>(info.Holder());
208217
info.GetReturnValue().Set(Nan::New(obj->m_isMedia));
@@ -214,6 +223,24 @@ NAN_SETTER(QuicTransportStream::isMediaSetter)
214223
obj->m_isMedia = value->ToBoolean(Nan::GetCurrentContext()).ToLocalChecked()->Value();
215224
}
216225

226+
NAN_GETTER(QuicTransportStream::onDataGetter)
227+
{
228+
QuicTransportStream* obj = Nan::ObjectWrap::Unwrap<QuicTransportStream>(info.Holder());
229+
info.GetReturnValue().Set(Nan::New(obj->m_onDataCallback));
230+
}
231+
232+
NAN_SETTER(QuicTransportStream::onDataSetter)
233+
{
234+
QuicTransportStream* obj = Nan::ObjectWrap::Unwrap<QuicTransportStream>(info.Holder());
235+
if (value->IsFunction()) {
236+
Nan::Persistent<v8::Value> persistentCallback(value);
237+
obj->m_onDataCallback.Reset(persistentCallback);
238+
obj->CheckReadableData();
239+
} else {
240+
obj->m_onDataCallback.Reset();
241+
}
242+
}
243+
217244
v8::Local<v8::Object> QuicTransportStream::newInstance(owt::quic::WebTransportStreamInterface* stream)
218245
{
219246
Local<Object> streamObject = Nan::NewInstance(Nan::New(QuicTransportStream::s_constructor)).ToLocalChecked();
@@ -273,6 +300,7 @@ NAUV_WORK_CB(QuicTransportStream::onData)
273300
if (obj == nullptr) {
274301
return;
275302
}
303+
// TODO: Check m_onDataCallback instead of reading ondata.
276304
Nan::MaybeLocal<v8::Value> onEvent = Nan::Get(obj->handle(), Nan::New<v8::String>("ondata").ToLocalChecked());
277305
if (!onEvent.IsEmpty()) {
278306
v8::Local<v8::Value> onEventLocal = onEvent.ToLocalChecked();

source/agent/addons/quic/QuicTransportStream.h

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -42,6 +42,8 @@ class QuicTransportStream : public owt_base::FrameSource, public owt_base::Frame
4242

4343
static NAN_GETTER(isMediaGetter);
4444
static NAN_SETTER(isMediaSetter);
45+
static NAN_GETTER(onDataGetter);
46+
static NAN_SETTER(onDataSetter);
4547

4648
static NAUV_WORK_CB(onContentSessionId);
4749
static NAUV_WORK_CB(onTrackId);
@@ -78,6 +80,8 @@ class QuicTransportStream : public owt_base::FrameSource, public owt_base::Frame
7880
void ReadTrackId();
7981
void SignalOnData();
8082
void ReallocateBuffer(size_t size);
83+
// Check whether there is readable data. If so, fire ondata event.
84+
void CheckReadableData();
8185
void AddedDestination();
8286
void RemovedDestination();
8387

@@ -96,6 +100,7 @@ class QuicTransportStream : public owt_base::FrameSource, public owt_base::Frame
96100

97101
// Indicates whether this is a media stream. If this is not a media stream, it can only be piped to another QUIC agent.
98102
bool m_isMedia;
103+
Nan::Persistent<v8::Value> m_onDataCallback;
99104

100105
size_t m_readingFrameSize;
101106
size_t m_frameSizeOffset;

source/agent/quic/webtransport/quicTransportServer.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -151,7 +151,7 @@ module.exports = class QuicTransportServer extends EventEmitter {
151151
}
152152
return;
153153
}
154-
}
154+
};
155155
}
156156
}
157157
}

0 commit comments

Comments
 (0)