@@ -58,6 +58,7 @@ QuicTransportStream::~QuicTransportStream()
58
58
}
59
59
m_stream->SetVisitor (nullptr );
60
60
delete[] m_buffer;
61
+ m_onDataCallback.Reset ();
61
62
}
62
63
63
64
void QuicTransportStream::OnCanRead ()
@@ -123,6 +124,7 @@ NAN_MODULE_INIT(QuicTransportStream::init)
123
124
Nan::SetPrototypeMethod (tpl, " readTrackId" , readTrackId);
124
125
Nan::SetPrototypeMethod (tpl, " addDestination" , addDestination);
125
126
Nan::SetAccessor (instanceTpl, Nan::New (" isMedia" ).ToLocalChecked (), isMediaGetter, isMediaSetter);
127
+ Nan::SetAccessor (instanceTpl, Nan::New (" ondata" ).ToLocalChecked (), onDataGetter, onDataSetter);
126
128
127
129
s_constructor.Reset (Nan::GetFunction (tpl).ToLocalChecked ());
128
130
Nan::Set (target, Nan::New (" QuicTransportStream" ).ToLocalChecked (), Nan::GetFunction (tpl).ToLocalChecked ());
@@ -203,6 +205,13 @@ NAN_METHOD(QuicTransportStream::readTrackId){
203
205
obj->ReadTrackId ();
204
206
}
205
207
208
+ void QuicTransportStream::CheckReadableData ()
209
+ {
210
+ if (m_stream->ReadableBytes () > 0 ) {
211
+ SignalOnData ();
212
+ }
213
+ }
214
+
206
215
NAN_GETTER (QuicTransportStream::isMediaGetter){
207
216
QuicTransportStream* obj = Nan::ObjectWrap::Unwrap<QuicTransportStream>(info.Holder ());
208
217
info.GetReturnValue ().Set (Nan::New (obj->m_isMedia ));
@@ -214,6 +223,24 @@ NAN_SETTER(QuicTransportStream::isMediaSetter)
214
223
obj->m_isMedia = value->ToBoolean (Nan::GetCurrentContext ()).ToLocalChecked ()->Value ();
215
224
}
216
225
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
+
217
244
v8::Local<v8::Object> QuicTransportStream::newInstance (owt::quic::WebTransportStreamInterface* stream)
218
245
{
219
246
Local<Object> streamObject = Nan::NewInstance (Nan::New (QuicTransportStream::s_constructor)).ToLocalChecked ();
@@ -273,6 +300,7 @@ NAUV_WORK_CB(QuicTransportStream::onData)
273
300
if (obj == nullptr ) {
274
301
return ;
275
302
}
303
+ // TODO: Check m_onDataCallback instead of reading ondata.
276
304
Nan::MaybeLocal<v8::Value> onEvent = Nan::Get (obj->handle (), Nan::New<v8::String>(" ondata" ).ToLocalChecked ());
277
305
if (!onEvent.IsEmpty ()) {
278
306
v8::Local<v8::Value> onEventLocal = onEvent.ToLocalChecked ();
0 commit comments