From 0b5deca63a7feb173dadbc9977fd3823eb27f6a8 Mon Sep 17 00:00:00 2001 From: neoxpert <18628980+neoxpert@users.noreply.github.com> Date: Fri, 5 Jun 2026 22:36:38 +0200 Subject: [PATCH 1/3] allow setting int64_t based options by passing BigInt values --- spec/srt_spec.js | 10 +++++++++- src/node-srt.cc | 48 +++++++++++++++++++++++++++++++++++++++++------- 2 files changed, 50 insertions(+), 8 deletions(-) diff --git a/spec/srt_spec.js b/spec/srt_spec.js index dc0398d..ab8bc97 100644 --- a/spec/srt_spec.js +++ b/spec/srt_spec.js @@ -1,4 +1,4 @@ -const { SRT } = require('../index.js'); +const { SRT } = require("../index.js"); describe("SRT library", () => { it("exposes constants", () => { @@ -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); + }); }); diff --git a/src/node-srt.cc b/src/node-srt.cc index 4f8dd4f..f88a5f1 100644 --- a/src/node-srt.cc +++ b/src/node-srt.cc @@ -249,7 +249,26 @@ Napi::Value NodeSRT::SetSockOpt(const Napi::CallbackInfo& info) { Napi::Number option = info[1].As(); 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(); + 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(); int32_t optName = option; int optValue = value; @@ -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: @@ -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: @@ -357,11 +388,14 @@ Napi::Value NodeSRT::GetSockOpt(const Napi::CallbackInfo& info) { case SRTO_PASSPHRASE: case SRTO_STREAMID: { - char optValue[512]; - int optSize = sizeof(optValue); + char optValue[512] = {0}; + int optSize = sizeof(optValue) - 1; result = srt_getsockflag(socketValue, (SRT_SOCKOPT)optName, (void *)&optValue, &optSize); - - returnVal = Napi::Value::From(env, std::string(optValue)); + if (result == SRT_ERROR) { + Napi::TypeError::New(env, "Failed to get SRT socket option").ThrowAsJavaScriptException(); + return env.Undefined(); + } + returnVal = Napi::Value::From(env, std::string(optValue, static_cast(optSize))); break; } default: From eef0559345c72c3161c473f96ac8125ae08b6bbd Mon Sep 17 00:00:00 2001 From: neoxpert <18628980+neoxpert@users.noreply.github.com> Date: Tue, 14 Jul 2026 12:41:37 +0200 Subject: [PATCH 2/3] restore single quotes --- spec/srt_spec.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/spec/srt_spec.js b/spec/srt_spec.js index ab8bc97..c117b21 100644 --- a/spec/srt_spec.js +++ b/spec/srt_spec.js @@ -1,4 +1,4 @@ -const { SRT } = require("../index.js"); +const { SRT } = require('../index.js'); describe("SRT library", () => { it("exposes constants", () => { From 99ed65addc5fd6b04321e8ab8a8312d04c15792b Mon Sep 17 00:00:00 2001 From: neoxpert <18628980+neoxpert@users.noreply.github.com> Date: Tue, 14 Jul 2026 12:46:09 +0200 Subject: [PATCH 3/3] revert changes on reading string options --- src/node-srt.cc | 11 ++++------- 1 file changed, 4 insertions(+), 7 deletions(-) diff --git a/src/node-srt.cc b/src/node-srt.cc index f88a5f1..c285a93 100644 --- a/src/node-srt.cc +++ b/src/node-srt.cc @@ -388,14 +388,11 @@ Napi::Value NodeSRT::GetSockOpt(const Napi::CallbackInfo& info) { case SRTO_PASSPHRASE: case SRTO_STREAMID: { - char optValue[512] = {0}; - int optSize = sizeof(optValue) - 1; + char optValue[512]; + 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 socket option").ThrowAsJavaScriptException(); - return env.Undefined(); - } - returnVal = Napi::Value::From(env, std::string(optValue, static_cast(optSize))); + + returnVal = Napi::Value::From(env, std::string(optValue)); break; } default: