Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
8 changes: 8 additions & 0 deletions spec/srt_spec.js
Original file line number Diff line number Diff line change
Expand Up @@ -78,4 +78,12 @@ describe("SRT library", () => {
expect(SRT.SRTO_UDP_SNDBUF).toEqual(8);
expect(SRT.SRTO_RCVLATENCY).toEqual(43);
});

it("can set and get maxbw as bigint", () => {
const srt = new SRT();
const socket = srt.createSocket();
srt.setSockOpt(socket, SRT.SRTO_MAXBW, 1000000n);
const set = srt.getSockOpt(socket, SRT.SRTO_MAXBW);
expect(set).toEqual(1000000n);
});
});
37 changes: 34 additions & 3 deletions src/node-srt.cc
Original file line number Diff line number Diff line change
Expand Up @@ -249,7 +249,26 @@ Napi::Value NodeSRT::SetSockOpt(const Napi::CallbackInfo& info) {
Napi::Number option = info[1].As<Napi::Number>();
int result = SRT_ERROR;

if (info[2].IsNumber()) {
if (info[2].IsEmpty()) {
Napi::TypeError::New(env, "Value is empty").ThrowAsJavaScriptException();
return env.Undefined();
}

if (info[2].IsBigInt()) {
Napi::BigInt value = info[2].As<Napi::BigInt>();
int32_t optName = option;
bool lossless = true;
int64_t optValue = value.Int64Value(&lossless);
if (!lossless) {
Napi::Error::New(env, "BigInt value overflows int64_t").ThrowAsJavaScriptException();
return Napi::Number::New(env, SRT_ERROR);
}
result = srt_setsockflag(socketValue, (SRT_SOCKOPT) optName, &optValue, sizeof(int64_t));
if (result == SRT_ERROR) {
Napi::Error::New(env, srt_getlasterror_str()).ThrowAsJavaScriptException();
return Napi::Number::New(env, SRT_ERROR);
}
} else if (info[2].IsNumber()) {
Napi::Number value = info[2].As<Napi::Number>();
int32_t optName = option;
int optValue = value;
Expand Down Expand Up @@ -296,11 +315,24 @@ Napi::Value NodeSRT::GetSockOpt(const Napi::CallbackInfo& info) {
int result = SRT_ERROR;

switch((SRT_SOCKOPT)optName) {
case SRTO_INPUTBW:
case SRTO_MAXBW:
case SRTO_MININPUTBW:
{
int64_t optValue = 0;
int optSize = sizeof(optValue);
result = srt_getsockflag(socketValue, (SRT_SOCKOPT)optName, (void *)&optValue, &optSize);
if (result == SRT_ERROR) {
Napi::TypeError::New(env, "Failed to get SRT bandwidth option").ThrowAsJavaScriptException();
return env.Undefined();
}
returnVal = Napi::BigInt::New(env, optValue);
break;
}
case SRTO_MSS:
case SRTO_CONNTIMEO:
case SRTO_EVENT:
case SRTO_FC:
case SRTO_INPUTBW:
case SRTO_IPTOS:
case SRTO_ISN:
case SRTO_IPTTL:
Expand All @@ -310,7 +342,6 @@ Napi::Value NodeSRT::GetSockOpt(const Napi::CallbackInfo& info) {
case SRTO_KMSTATE:
case SRTO_LATENCY:
case SRTO_LOSSMAXTTL:
case SRTO_MAXBW:
case SRTO_MINVERSION:
case SRTO_OHEADBW:
case SRTO_PAYLOADSIZE:
Expand Down
Loading