Implemented bindings for epoll

This commit is contained in:
birme 2020-06-24 12:18:01 +02:00
parent 08d1eedad8
commit 8ff82099b8
3 changed files with 54 additions and 4 deletions

View file

@ -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);
});
});

View file

@ -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>();
Napi::Number socketValue = info[1].As<Napi::Number>();
Napi::Number eventsValue = info[2].As<Napi::Number>();
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>();
Napi::Number msTimeOut = info[1].As<Napi::Number>();
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;
}

View file

@ -22,5 +22,5 @@ class NodeSRT : public Napi::ObjectWrap<NodeSRT> {
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);
};