From cbf6e2ca873ebb51183fe7fdbd077ca9f2864d87 Mon Sep 17 00:00:00 2001 From: birme Date: Wed, 24 Jun 2020 10:53:45 +0200 Subject: [PATCH] Ability to set and get sockopt --- spec/srt_spec.js | 20 +++++++++++++--- src/node-srt.cc | 59 +++++++++++++++++++++++++++++++++++++++++++++++- src/node-srt.h | 2 ++ 3 files changed, 77 insertions(+), 4 deletions(-) diff --git a/spec/srt_spec.js b/spec/srt_spec.js index 7287f4b..d577434 100644 --- a/spec/srt_spec.js +++ b/spec/srt_spec.js @@ -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); + }); }); \ No newline at end of file diff --git a/src/node-srt.cc b/src/node-srt.cc index d4bc7eb..645f90b 100644 --- a/src/node-srt.cc +++ b/src/node-srt.cc @@ -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 option = info[1].As(); + int result = SRT_ERROR; + + if (info[2].IsNumber()) { + Napi::Number value = info[2].As(); + 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 option = info[1].As(); + + 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; } \ No newline at end of file diff --git a/src/node-srt.h b/src/node-srt.h index 26aee06..da7a531 100644 --- a/src/node-srt.h +++ b/src/node-srt.h @@ -16,4 +16,6 @@ class NodeSRT : public Napi::ObjectWrap { 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); };