diff --git a/spec/srt_spec.js b/spec/srt_spec.js index 836d593..fa55b89 100644 --- a/spec/srt_spec.js +++ b/spec/srt_spec.js @@ -42,4 +42,16 @@ describe("SRT library", () => { const value = srt.getSockOpt(socket, SRT.SRTO_RCVSYN); expect(value).toEqual(false); }); + + it("can setup non-blocking event poll", () => { + const srt = new SRT(); + const socket = srt.createSocket(); + srt.setSockOpt(socket, SRT.SRTO_RCVSYN, false); + srt.bind(socket, "0.0.0.0", 1234); + srt.listen(socket, 10); + const epid = srt.epollCreate(); + srt.epollAddUsock(epid, socket, SRT.EPOLL_IN | SRT.EPOLL_ERR); + const events = srt.epollUWait(epid, 500); + expect(events.length).toEqual(0); + }); }); \ No newline at end of file diff --git a/src/node-srt.cc b/src/node-srt.cc index 389045f..74c6a81 100644 --- a/src/node-srt.cc +++ b/src/node-srt.cc @@ -26,7 +26,7 @@ Napi::Object NodeSRT::Init(Napi::Env env, Napi::Object exports) { InstanceMethod("getSockState", &NodeSRT::GetSockState), InstanceMethod("epollCreate", &NodeSRT::EpollCreate), InstanceMethod("epollAddUsock", &NodeSRT::EpollAddUsock), - InstanceMethod("epollWait", &NodeSRT::EpollWait), + InstanceMethod("epollUWait", &NodeSRT::EpollUWait), StaticValue("ERROR", Napi::Number::New(env, SRT_ERROR)), StaticValue("INVALID_SOCK", Napi::Number::New(env, SRT_INVALID_SOCK)), @@ -307,13 +307,51 @@ Napi::Value NodeSRT::GetSockState(const Napi::CallbackInfo& info) { } Napi::Value NodeSRT::EpollCreate(const Napi::CallbackInfo& info) { - + Napi::Env env = info.Env(); + Napi::HandleScope scope(env); + + int epid = srt_epoll_create(); + if (epid < 0) { + Napi::Error::New(env, srt_getlasterror_str()).ThrowAsJavaScriptException(); + return Napi::Number::New(env, SRT_ERROR); + } + return Napi::Number::New(env, epid); } Napi::Value NodeSRT::EpollAddUsock(const Napi::CallbackInfo& info) { + Napi::Env env = info.Env(); + Napi::HandleScope scope(env); + Napi::Number epidValue = info[0].As(); + Napi::Number socketValue = info[1].As(); + Napi::Number eventsValue = info[2].As(); + + int events = eventsValue; + int result = srt_epoll_add_usock(epidValue, socketValue, &events); + if (result == SRT_ERROR) { + Napi::Error::New(env, srt_getlasterror_str()).ThrowAsJavaScriptException(); + return Napi::Number::New(env, SRT_ERROR); + } + return Napi::Number::New(env, result); } -Napi::Value NodeSRT::EpollWait(const Napi::CallbackInfo& info) { +Napi::Value NodeSRT::EpollUWait(const Napi::CallbackInfo& info) { + Napi::Env env = info.Env(); + Napi::HandleScope scope(env); + + Napi::Number epidValue = info[0].As(); + Napi::Number msTimeOut = info[1].As(); + int fdsSetSize = 100; + SRT_EPOLL_EVENT fdsSet[fdsSetSize]; + int n = srt_epoll_uwait(epidValue, fdsSet, fdsSetSize, msTimeOut); + Napi::Array events = Napi::Array::New(env, n); + for(int i = 0; i < n; i++) { + Napi::Object event = Napi::Object::New(env); + event.Set(Napi::String::New(env, "socket"), Napi::Number::New(env, fdsSet[i].fd)); + event.Set(Napi::String::New(env, "events"), Napi::Number::New(env, fdsSet[i].events)); + events[i] = event; + } + + return events; } diff --git a/src/node-srt.h b/src/node-srt.h index ce0c2d0..9176166 100644 --- a/src/node-srt.h +++ b/src/node-srt.h @@ -22,5 +22,5 @@ class NodeSRT : public Napi::ObjectWrap { Napi::Value EpollCreate(const Napi::CallbackInfo& info); Napi::Value EpollAddUsock(const Napi::CallbackInfo& info); - Napi::Value EpollWait(const Napi::CallbackInfo& info); + Napi::Value EpollUWait(const Napi::CallbackInfo& info); };