Ability to set and get sockopt

This commit is contained in:
birme 2020-06-24 10:53:45 +02:00
parent b0189b20df
commit cbf6e2ca87
3 changed files with 77 additions and 4 deletions

View file

@ -1,15 +1,29 @@
const { SRT } = require('../index.js');
describe("SRT library", () => {
it("exposes constants", () => {
expect(SRT.ERROR).toEqual(-1);
expect(SRT.INVALID_SOCK).toEqual(-1);
});
it("can create an SRT socket", () => {
const srt = new SRT();
const socket = srt.createSocket();
expect(socket).not.toEqual(-1);
expect(socket).not.toEqual(SRT.ERROR);
});
it("can create an SRT socket for sending data", () => {
const srt = new SRT();
const socket = srt.createSocket(true);
expect(socket).not.toEqual(-1);
})
expect(socket).not.toEqual(SRT.ERROR);
});
it("can set SRT sockopt SRTO_MSS", () => {
const srt = new SRT();
const socket = srt.createSocket();
const result = srt.setSockOpt(socket, SRT.SRTO_MSS, 1052);
expect(result).not.toEqual(SRT.ERROR);
const value = srt.getSockOpt(socket, SRT.SRTO_MSS);
expect(value).toEqual(1052);
});
});

View file

@ -21,10 +21,15 @@ Napi::Object NodeSRT::Init(Napi::Env env, Napi::Object exports) {
InstanceMethod("close", &NodeSRT::Close),
InstanceMethod("read", &NodeSRT::Read),
InstanceMethod("write", &NodeSRT::Write),
InstanceMethod("setSockOpt", &NodeSRT::SetSockOpt),
InstanceMethod("getSockOpt", &NodeSRT::GetSockOpt),
StaticValue("ERROR", Napi::Number::New(env, -1)),
StaticValue("INVALID_SOCK", Napi::Number::New(env, -1)),
StaticValue("SRTO_MSS", Napi::Number::New(env, 0)),
StaticValue("SRTO_SNDSYN", Napi::Number::New(env, 1)),
});
constructor = Napi::Persistent(func);
@ -203,4 +208,56 @@ Napi::Value NodeSRT::Write(const Napi::CallbackInfo& info) {
return Napi::Number::New(env, SRT_ERROR);
}
return Napi::Number::New(env, result);
}
Napi::Value NodeSRT::SetSockOpt(const Napi::CallbackInfo& info) {
Napi::Env env = info.Env();
Napi::HandleScope scope(env);
Napi::Number socketValue = info[0].As<Napi::Number>();
Napi::Number option = info[1].As<Napi::Number>();
int result = SRT_ERROR;
if (info[2].IsNumber()) {
Napi::Number value = info[2].As<Napi::Number>();
int32_t optName = option;
int optValue = value;
result = srt_setsockflag(socketValue, (SRT_SOCKOPT)optName, &optValue, sizeof(int));
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::GetSockOpt(const Napi::CallbackInfo& info) {
Napi::Env env = info.Env();
Napi::HandleScope scope(env);
Napi::Number socketValue = info[0].As<Napi::Number>();
Napi::Number option = info[1].As<Napi::Number>();
Napi::Value empty;
int32_t optName = option;
int result = SRT_ERROR;
switch((SRT_SOCKOPT)optName) {
case SRTO_MSS:
{
int optValue;
int optSize = sizeof(optValue);
result = srt_getsockflag(socketValue, (SRT_SOCKOPT)optName, (void *)&optValue, &optSize);
return Napi::Value::From(env, optValue);
}
default:
Napi::Error::New(env, "SOCKOPT not implemented yet").ThrowAsJavaScriptException();
break;
}
if (result == SRT_ERROR) {
Napi::Error::New(env, srt_getlasterror_str()).ThrowAsJavaScriptException();
return empty;
}
return empty;
}

View file

@ -16,4 +16,6 @@ class NodeSRT : public Napi::ObjectWrap<NodeSRT> {
Napi::Value Close(const Napi::CallbackInfo& info);
Napi::Value Read(const Napi::CallbackInfo& info);
Napi::Value Write(const Napi::CallbackInfo& info);
Napi::Value SetSockOpt(const Napi::CallbackInfo& info);
Napi::Value GetSockOpt(const Napi::CallbackInfo& info);
};