@lng2004/node-datachannel 0.31.0-20251228

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (171) hide show
  1. package/.clang-format +17 -0
  2. package/.editorconfig +12 -0
  3. package/.eslintignore +8 -0
  4. package/.eslintrc.json +27 -0
  5. package/.gitmodules +3 -0
  6. package/.prettierignore +7 -0
  7. package/.prettierrc +13 -0
  8. package/API.md +247 -0
  9. package/BULDING.md +33 -0
  10. package/CMakeLists.txt +134 -0
  11. package/LICENSE +373 -0
  12. package/README.md +130 -0
  13. package/dist/cjs/index.cjs +11 -0
  14. package/dist/cjs/index.cjs.map +1 -0
  15. package/dist/cjs/lib/datachannel-stream.cjs +101 -0
  16. package/dist/cjs/lib/datachannel-stream.cjs.map +1 -0
  17. package/dist/cjs/lib/index.cjs +88 -0
  18. package/dist/cjs/lib/index.cjs.map +1 -0
  19. package/dist/cjs/lib/node-datachannel.cjs +8 -0
  20. package/dist/cjs/lib/node-datachannel.cjs.map +1 -0
  21. package/dist/cjs/lib/websocket-server.cjs +45 -0
  22. package/dist/cjs/lib/websocket-server.cjs.map +1 -0
  23. package/dist/cjs/lib/websocket.cjs +8 -0
  24. package/dist/cjs/lib/websocket.cjs.map +1 -0
  25. package/dist/cjs/polyfill/Events.cjs +86 -0
  26. package/dist/cjs/polyfill/Events.cjs.map +1 -0
  27. package/dist/cjs/polyfill/Exception.cjs +34 -0
  28. package/dist/cjs/polyfill/Exception.cjs.map +1 -0
  29. package/dist/cjs/polyfill/RTCCertificate.cjs +34 -0
  30. package/dist/cjs/polyfill/RTCCertificate.cjs.map +1 -0
  31. package/dist/cjs/polyfill/RTCDataChannel.cjs +214 -0
  32. package/dist/cjs/polyfill/RTCDataChannel.cjs.map +1 -0
  33. package/dist/cjs/polyfill/RTCDtlsTransport.cjs +53 -0
  34. package/dist/cjs/polyfill/RTCDtlsTransport.cjs.map +1 -0
  35. package/dist/cjs/polyfill/RTCError.cjs +83 -0
  36. package/dist/cjs/polyfill/RTCError.cjs.map +1 -0
  37. package/dist/cjs/polyfill/RTCIceCandidate.cjs +132 -0
  38. package/dist/cjs/polyfill/RTCIceCandidate.cjs.map +1 -0
  39. package/dist/cjs/polyfill/RTCIceTransport.cjs +94 -0
  40. package/dist/cjs/polyfill/RTCIceTransport.cjs.map +1 -0
  41. package/dist/cjs/polyfill/RTCPeerConnection.cjs +434 -0
  42. package/dist/cjs/polyfill/RTCPeerConnection.cjs.map +1 -0
  43. package/dist/cjs/polyfill/RTCSctpTransport.cjs +59 -0
  44. package/dist/cjs/polyfill/RTCSctpTransport.cjs.map +1 -0
  45. package/dist/cjs/polyfill/RTCSessionDescription.cjs +45 -0
  46. package/dist/cjs/polyfill/RTCSessionDescription.cjs.map +1 -0
  47. package/dist/cjs/polyfill/index.cjs +42 -0
  48. package/dist/cjs/polyfill/index.cjs.map +1 -0
  49. package/dist/esm/index.mjs +8 -0
  50. package/dist/esm/index.mjs.map +1 -0
  51. package/dist/esm/lib/datachannel-stream.mjs +78 -0
  52. package/dist/esm/lib/datachannel-stream.mjs.map +1 -0
  53. package/dist/esm/lib/index.mjs +62 -0
  54. package/dist/esm/lib/index.mjs.map +1 -0
  55. package/dist/esm/lib/node-datachannel.mjs +12 -0
  56. package/dist/esm/lib/node-datachannel.mjs.map +1 -0
  57. package/dist/esm/lib/websocket-server.mjs +43 -0
  58. package/dist/esm/lib/websocket-server.mjs.map +1 -0
  59. package/dist/esm/lib/websocket.mjs +6 -0
  60. package/dist/esm/lib/websocket.mjs.map +1 -0
  61. package/dist/esm/polyfill/Events.mjs +82 -0
  62. package/dist/esm/polyfill/Events.mjs.map +1 -0
  63. package/dist/esm/polyfill/Exception.mjs +28 -0
  64. package/dist/esm/polyfill/Exception.mjs.map +1 -0
  65. package/dist/esm/polyfill/RTCCertificate.mjs +30 -0
  66. package/dist/esm/polyfill/RTCCertificate.mjs.map +1 -0
  67. package/dist/esm/polyfill/RTCDataChannel.mjs +210 -0
  68. package/dist/esm/polyfill/RTCDataChannel.mjs.map +1 -0
  69. package/dist/esm/polyfill/RTCDtlsTransport.mjs +49 -0
  70. package/dist/esm/polyfill/RTCDtlsTransport.mjs.map +1 -0
  71. package/dist/esm/polyfill/RTCError.mjs +79 -0
  72. package/dist/esm/polyfill/RTCError.mjs.map +1 -0
  73. package/dist/esm/polyfill/RTCIceCandidate.mjs +128 -0
  74. package/dist/esm/polyfill/RTCIceCandidate.mjs.map +1 -0
  75. package/dist/esm/polyfill/RTCIceTransport.mjs +89 -0
  76. package/dist/esm/polyfill/RTCIceTransport.mjs.map +1 -0
  77. package/dist/esm/polyfill/RTCPeerConnection.mjs +430 -0
  78. package/dist/esm/polyfill/RTCPeerConnection.mjs.map +1 -0
  79. package/dist/esm/polyfill/RTCSctpTransport.mjs +55 -0
  80. package/dist/esm/polyfill/RTCSctpTransport.mjs.map +1 -0
  81. package/dist/esm/polyfill/RTCSessionDescription.mjs +41 -0
  82. package/dist/esm/polyfill/RTCSessionDescription.mjs.map +1 -0
  83. package/dist/esm/polyfill/index.mjs +27 -0
  84. package/dist/esm/polyfill/index.mjs.map +1 -0
  85. package/dist/types/lib/datachannel-stream.d.ts +24 -0
  86. package/dist/types/lib/index.d.ts +235 -0
  87. package/dist/types/lib/types.d.ts +118 -0
  88. package/dist/types/lib/websocket-server.d.ts +13 -0
  89. package/dist/types/lib/websocket.d.ts +25 -0
  90. package/dist/types/polyfill/Events.d.ts +15 -0
  91. package/dist/types/polyfill/RTCCertificate.d.ts +9 -0
  92. package/dist/types/polyfill/RTCDataChannel.d.ts +29 -0
  93. package/dist/types/polyfill/RTCDtlsTransport.d.ts +15 -0
  94. package/dist/types/polyfill/RTCError.d.ts +17 -0
  95. package/dist/types/polyfill/RTCIceCandidate.d.ts +21 -0
  96. package/dist/types/polyfill/RTCIceTransport.d.ts +30 -0
  97. package/dist/types/polyfill/RTCPeerConnection.d.ts +64 -0
  98. package/dist/types/polyfill/RTCSctpTransport.d.ts +15 -0
  99. package/dist/types/polyfill/RTCSessionDescription.d.ts +10 -0
  100. package/dist/types/polyfill/index.d.ts +26 -0
  101. package/jest.config.ts +14 -0
  102. package/package.json +121 -0
  103. package/rollup.config.mjs +72 -0
  104. package/src/cpp/data-channel-wrapper.cpp +530 -0
  105. package/src/cpp/data-channel-wrapper.h +63 -0
  106. package/src/cpp/ice-udp-mux-listener-wrapper.cpp +157 -0
  107. package/src/cpp/ice-udp-mux-listener-wrapper.h +43 -0
  108. package/src/cpp/main.cpp +58 -0
  109. package/src/cpp/media-audio-wrapper.cpp +457 -0
  110. package/src/cpp/media-audio-wrapper.h +52 -0
  111. package/src/cpp/media-av1packetization.cpp +24 -0
  112. package/src/cpp/media-av1packetization.h +11 -0
  113. package/src/cpp/media-av1rtppacketizer-wrapper.cpp +126 -0
  114. package/src/cpp/media-av1rtppacketizer-wrapper.h +29 -0
  115. package/src/cpp/media-direction.cpp +43 -0
  116. package/src/cpp/media-direction.h +10 -0
  117. package/src/cpp/media-h264rtppacketizer-wrapper.cpp +126 -0
  118. package/src/cpp/media-h264rtppacketizer-wrapper.h +30 -0
  119. package/src/cpp/media-h265rtppacketizer-wrapper.cpp +126 -0
  120. package/src/cpp/media-h265rtppacketizer-wrapper.h +30 -0
  121. package/src/cpp/media-h26xseparator.cpp +32 -0
  122. package/src/cpp/media-h26xseparator.h +11 -0
  123. package/src/cpp/media-mediahandler-helper.cpp +31 -0
  124. package/src/cpp/media-mediahandler-helper.h +11 -0
  125. package/src/cpp/media-pacinghandler-wrapper.cpp +79 -0
  126. package/src/cpp/media-pacinghandler-wrapper.h +28 -0
  127. package/src/cpp/media-rtcpnackresponder-wrapper.cpp +68 -0
  128. package/src/cpp/media-rtcpnackresponder-wrapper.h +28 -0
  129. package/src/cpp/media-rtcpreceivingsession-wrapper.cpp +57 -0
  130. package/src/cpp/media-rtcpreceivingsession-wrapper.h +28 -0
  131. package/src/cpp/media-rtcpsrreporter-wrapper.cpp +93 -0
  132. package/src/cpp/media-rtcpsrreporter-wrapper.h +30 -0
  133. package/src/cpp/media-rtppacketizationconfig-wrapper.cpp +167 -0
  134. package/src/cpp/media-rtppacketizationconfig-wrapper.h +35 -0
  135. package/src/cpp/media-rtppacketizer-wrapper.cpp +95 -0
  136. package/src/cpp/media-rtppacketizer-wrapper.h +30 -0
  137. package/src/cpp/media-track-wrapper.cpp +458 -0
  138. package/src/cpp/media-track-wrapper.h +61 -0
  139. package/src/cpp/media-video-wrapper.cpp +526 -0
  140. package/src/cpp/media-video-wrapper.h +56 -0
  141. package/src/cpp/peer-connection-wrapper.cpp +1298 -0
  142. package/src/cpp/peer-connection-wrapper.h +89 -0
  143. package/src/cpp/rtc-wrapper.cpp +205 -0
  144. package/src/cpp/rtc-wrapper.h +24 -0
  145. package/src/cpp/thread-safe-callback.cpp +57 -0
  146. package/src/cpp/thread-safe-callback.h +47 -0
  147. package/src/cpp/web-socket-server-wrapper.cpp +275 -0
  148. package/src/cpp/web-socket-server-wrapper.h +41 -0
  149. package/src/cpp/web-socket-wrapper.cpp +796 -0
  150. package/src/cpp/web-socket-wrapper.h +63 -0
  151. package/src/index.ts +9 -0
  152. package/src/lib/datachannel-stream.ts +100 -0
  153. package/src/lib/index.ts +283 -0
  154. package/src/lib/node-datachannel.ts +3 -0
  155. package/src/lib/types.ts +168 -0
  156. package/src/lib/websocket-server.ts +37 -0
  157. package/src/lib/websocket.ts +26 -0
  158. package/src/polyfill/Events.ts +82 -0
  159. package/src/polyfill/Exception.ts +37 -0
  160. package/src/polyfill/README.md +41 -0
  161. package/src/polyfill/RTCCertificate.ts +21 -0
  162. package/src/polyfill/RTCDataChannel.ts +225 -0
  163. package/src/polyfill/RTCDtlsTransport.ts +46 -0
  164. package/src/polyfill/RTCError.ts +78 -0
  165. package/src/polyfill/RTCIceCandidate.ts +128 -0
  166. package/src/polyfill/RTCIceTransport.ts +90 -0
  167. package/src/polyfill/RTCPeerConnection.ts +527 -0
  168. package/src/polyfill/RTCSctpTransport.ts +51 -0
  169. package/src/polyfill/RTCSessionDescription.ts +41 -0
  170. package/src/polyfill/index.ts +38 -0
  171. package/tsconfig.json +21 -0
@@ -0,0 +1,31 @@
1
+ #include "media-mediahandler-helper.h"
2
+ #include "media-av1rtppacketizer-wrapper.h"
3
+ #include "media-h264rtppacketizer-wrapper.h"
4
+ #include "media-h265rtppacketizer-wrapper.h"
5
+ #include "media-pacinghandler-wrapper.h"
6
+ #include "media-rtcpnackresponder-wrapper.h"
7
+ #include "media-rtcpreceivingsession-wrapper.h"
8
+ #include "media-rtcpsrreporter-wrapper.h"
9
+ #include "media-rtppacketizer-wrapper.h"
10
+
11
+ std::shared_ptr<rtc::MediaHandler> asMediaHandler(const Napi::Object &val)
12
+ {
13
+ std::shared_ptr<rtc::MediaHandler> mediaHandler;
14
+ if (val.InstanceOf(AV1RtpPacketizerWrapper::constructor.Value()))
15
+ mediaHandler = AV1RtpPacketizerWrapper::Unwrap(val)->getPacketizerInstance();
16
+ else if (val.InstanceOf(H264RtpPacketizerWrapper::constructor.Value()))
17
+ mediaHandler = H264RtpPacketizerWrapper::Unwrap(val)->getPacketizerInstance();
18
+ else if (val.InstanceOf(H265RtpPacketizerWrapper::constructor.Value()))
19
+ mediaHandler = H265RtpPacketizerWrapper::Unwrap(val)->getPacketizerInstance();
20
+ else if (val.InstanceOf(PacingHandlerWrapper::constructor.Value()))
21
+ mediaHandler = PacingHandlerWrapper::Unwrap(val)->getHandlerInstance();
22
+ else if (val.InstanceOf(RtcpNackResponderWrapper::constructor.Value()))
23
+ mediaHandler = RtcpNackResponderWrapper::Unwrap(val)->getResponderInstance();
24
+ else if (val.InstanceOf(RtcpReceivingSessionWrapper::constructor.Value()))
25
+ mediaHandler = RtcpReceivingSessionWrapper::Unwrap(val)->getSessionInstance();
26
+ else if (val.InstanceOf(RtcpSrReporterWrapper::constructor.Value()))
27
+ mediaHandler = RtcpSrReporterWrapper::Unwrap(val)->getReporterInstance();
28
+ else if (val.InstanceOf(RtpPacketizerWrapper::constructor.Value()))
29
+ mediaHandler = RtpPacketizerWrapper::Unwrap(val)->getPacketizerInstance();
30
+ return mediaHandler;
31
+ }
@@ -0,0 +1,11 @@
1
+ #ifndef MEDIA_MEDIAHANDLER_HELPER_H
2
+ #define MEDIA_MEDIAHANDLER_HELPER_H
3
+
4
+ #include <memory>
5
+
6
+ #include <napi.h>
7
+ #include <rtc/rtc.hpp>
8
+
9
+ std::shared_ptr<rtc::MediaHandler> asMediaHandler(const Napi::Object &obj);
10
+
11
+ #endif // MEDIA_MEDIAHANDLER_HELPER_H
@@ -0,0 +1,79 @@
1
+ #include "media-pacinghandler-wrapper.h"
2
+ #include "media-mediahandler-helper.h"
3
+ #include <chrono>
4
+
5
+ Napi::FunctionReference PacingHandlerWrapper::constructor = Napi::FunctionReference();
6
+
7
+ Napi::Object PacingHandlerWrapper::Init(Napi::Env env, Napi::Object exports)
8
+ {
9
+ Napi::HandleScope scope(env);
10
+
11
+ Napi::Function func = Napi::ObjectWrap<PacingHandlerWrapper>::DefineClass(env, "PacingHandler",
12
+ {
13
+ // Instance Methods
14
+ InstanceMethod("addToChain", &PacingHandlerWrapper::addToChain),
15
+ });
16
+
17
+ // If this is not the first call, we don't want to reassign the constructor (hot-reload problem)
18
+ if (constructor.IsEmpty())
19
+ {
20
+ constructor = Napi::Persistent(func);
21
+ constructor.SuppressDestruct();
22
+ }
23
+
24
+ exports.Set("PacingHandler", func);
25
+ return exports;
26
+ }
27
+
28
+ PacingHandlerWrapper::PacingHandlerWrapper(const Napi::CallbackInfo &info)
29
+ : Napi::ObjectWrap<PacingHandlerWrapper>(info)
30
+ {
31
+ Napi::Env env = info.Env();
32
+
33
+ if (info.Length() < 2)
34
+ {
35
+ Napi::TypeError::New(env, "Expected 2 parameters").ThrowAsJavaScriptException();
36
+ return;
37
+ }
38
+ if (!info[0].IsNumber())
39
+ {
40
+ Napi::TypeError::New(env, "Expected bitsPerSecond to be a number").ThrowAsJavaScriptException();
41
+ return;
42
+ }
43
+ if (!info[1].IsNumber())
44
+ {
45
+ Napi::TypeError::New(env, "Expected sendInterval to be a number").ThrowAsJavaScriptException();
46
+ return;
47
+ }
48
+ auto bitsPerSecond = info[0].As<Napi::Number>().DoubleValue();
49
+ auto sendInterval = info[1].As<Napi::Number>().Uint32Value();
50
+
51
+ mHandlerPtr = std::make_unique<rtc::PacingHandler>(
52
+ bitsPerSecond, std::chrono::milliseconds(sendInterval)
53
+ );
54
+ }
55
+
56
+ PacingHandlerWrapper::~PacingHandlerWrapper()
57
+ {
58
+ mHandlerPtr.reset();
59
+ }
60
+
61
+ std::shared_ptr<rtc::PacingHandler> PacingHandlerWrapper::getHandlerInstance() { return mHandlerPtr; }
62
+
63
+ void PacingHandlerWrapper::addToChain(const Napi::CallbackInfo &info)
64
+ {
65
+ auto env = info.Env();
66
+ if (info.Length() < 1 || !info[0].IsObject())
67
+ {
68
+ Napi::TypeError::New(env, "Expected a MediaHandler instance").ThrowAsJavaScriptException();
69
+ return;
70
+ }
71
+ auto mediaHandler = asMediaHandler(info[0].As<Napi::Object>());
72
+ if (!mediaHandler)
73
+ {
74
+ Napi::TypeError::New(env, "Expected a MediaHandler instance. If this error is unexpected, please report a bug!")
75
+ .ThrowAsJavaScriptException();
76
+ return;
77
+ }
78
+ mHandlerPtr->addToChain(mediaHandler);
79
+ }
@@ -0,0 +1,28 @@
1
+ #ifndef MEDIA_PACINGHANDLER_WRAPPER_H
2
+ #define MEDIA_PACINGHANDLER_WRAPPER_H
3
+
4
+ #include <memory>
5
+ #include <unordered_set>
6
+
7
+ #include <napi.h>
8
+ #include <rtc/rtc.hpp>
9
+
10
+ class PacingHandlerWrapper : public Napi::ObjectWrap<PacingHandlerWrapper>
11
+ {
12
+ public:
13
+ static Napi::FunctionReference constructor;
14
+ static Napi::Object Init(Napi::Env env, Napi::Object exports);
15
+ PacingHandlerWrapper(const Napi::CallbackInfo &info);
16
+ ~PacingHandlerWrapper();
17
+ std::shared_ptr<rtc::PacingHandler> getHandlerInstance();
18
+
19
+ // Functions
20
+ void addToChain(const Napi::CallbackInfo &info);
21
+
22
+ // Callbacks
23
+
24
+ private:
25
+ std::shared_ptr<rtc::PacingHandler> mHandlerPtr = nullptr;
26
+ };
27
+
28
+ #endif // MEDIA_PACINGHANDLER_WRAPPER_H
@@ -0,0 +1,68 @@
1
+ #include "media-rtcpnackresponder-wrapper.h"
2
+ #include "media-mediahandler-helper.h"
3
+
4
+ Napi::FunctionReference RtcpNackResponderWrapper::constructor = Napi::FunctionReference();
5
+
6
+ Napi::Object RtcpNackResponderWrapper::Init(Napi::Env env, Napi::Object exports)
7
+ {
8
+ Napi::HandleScope scope(env);
9
+
10
+ Napi::Function func = Napi::ObjectWrap<RtcpNackResponderWrapper>::DefineClass(env, "RtcpNackResponder",
11
+ {
12
+ // Instance Methods
13
+ InstanceMethod("addToChain", &RtcpNackResponderWrapper::addToChain),
14
+ });
15
+
16
+ // If this is not the first call, we don't want to reassign the constructor (hot-reload problem)
17
+ if (constructor.IsEmpty())
18
+ {
19
+ constructor = Napi::Persistent(func);
20
+ constructor.SuppressDestruct();
21
+ }
22
+
23
+ exports.Set("RtcpNackResponder", func);
24
+ return exports;
25
+ }
26
+
27
+ RtcpNackResponderWrapper::RtcpNackResponderWrapper(const Napi::CallbackInfo &info)
28
+ : Napi::ObjectWrap<RtcpNackResponderWrapper>(info)
29
+ {
30
+ Napi::Env env = info.Env();
31
+
32
+ size_t maxSize = rtc::RtcpNackResponder::DefaultMaxSize;
33
+ if (info.Length() >= 1)
34
+ {
35
+ if (!info[0].IsNumber())
36
+ {
37
+ Napi::TypeError::New(env, "maxSize must be a number").ThrowAsJavaScriptException();
38
+ return;
39
+ }
40
+ maxSize = info[0].As<Napi::Number>().Int64Value();
41
+ }
42
+ mResponderPtr = std::make_unique<rtc::RtcpNackResponder>(maxSize);
43
+ }
44
+
45
+ RtcpNackResponderWrapper::~RtcpNackResponderWrapper()
46
+ {
47
+ mResponderPtr.reset();
48
+ }
49
+
50
+ std::shared_ptr<rtc::RtcpNackResponder> RtcpNackResponderWrapper::getResponderInstance() { return mResponderPtr; }
51
+
52
+ void RtcpNackResponderWrapper::addToChain(const Napi::CallbackInfo &info)
53
+ {
54
+ auto env = info.Env();
55
+ if (info.Length() < 1 || !info[0].IsObject())
56
+ {
57
+ Napi::TypeError::New(env, "Expected a MediaHandler instance").ThrowAsJavaScriptException();
58
+ return;
59
+ }
60
+ auto mediaHandler = asMediaHandler(info[0].As<Napi::Object>());
61
+ if (!mediaHandler)
62
+ {
63
+ Napi::TypeError::New(env, "Expected a MediaHandler instance. If this error is unexpected, please report a bug!")
64
+ .ThrowAsJavaScriptException();
65
+ return;
66
+ }
67
+ mResponderPtr->addToChain(mediaHandler);
68
+ }
@@ -0,0 +1,28 @@
1
+ #ifndef MEDIA_RTCPNACKRESPONDER_WRAPPER_H
2
+ #define MEDIA_RTCPNACKRESPONDER_WRAPPER_H
3
+
4
+ #include <memory>
5
+ #include <unordered_set>
6
+
7
+ #include <napi.h>
8
+ #include <rtc/rtc.hpp>
9
+
10
+ class RtcpNackResponderWrapper : public Napi::ObjectWrap<RtcpNackResponderWrapper>
11
+ {
12
+ public:
13
+ static Napi::FunctionReference constructor;
14
+ static Napi::Object Init(Napi::Env env, Napi::Object exports);
15
+ RtcpNackResponderWrapper(const Napi::CallbackInfo &info);
16
+ ~RtcpNackResponderWrapper();
17
+ std::shared_ptr<rtc::RtcpNackResponder> getResponderInstance();
18
+
19
+ // Functions
20
+ void addToChain(const Napi::CallbackInfo &info);
21
+
22
+ // Callbacks
23
+
24
+ private:
25
+ std::shared_ptr<rtc::RtcpNackResponder> mResponderPtr = nullptr;
26
+ };
27
+
28
+ #endif // MEDIA_RTCPNACKRESPONDER_WRAPPER_H
@@ -0,0 +1,57 @@
1
+ #include "media-rtcpreceivingsession-wrapper.h"
2
+ #include "media-mediahandler-helper.h"
3
+
4
+ Napi::FunctionReference RtcpReceivingSessionWrapper::constructor = Napi::FunctionReference();
5
+
6
+ Napi::Object RtcpReceivingSessionWrapper::Init(Napi::Env env, Napi::Object exports)
7
+ {
8
+ Napi::HandleScope scope(env);
9
+
10
+ Napi::Function func = Napi::ObjectWrap<RtcpReceivingSessionWrapper>::DefineClass(env, "RtcpReceivingSession",
11
+ {
12
+ // Instance Methods
13
+ InstanceMethod("addToChain", &RtcpReceivingSessionWrapper::addToChain),
14
+ });
15
+
16
+ // If this is not the first call, we don't want to reassign the constructor (hot-reload problem)
17
+ if (constructor.IsEmpty())
18
+ {
19
+ constructor = Napi::Persistent(func);
20
+ constructor.SuppressDestruct();
21
+ }
22
+
23
+ exports.Set("RtcpReceivingSession", func);
24
+ return exports;
25
+ }
26
+
27
+ RtcpReceivingSessionWrapper::RtcpReceivingSessionWrapper(const Napi::CallbackInfo &info)
28
+ : Napi::ObjectWrap<RtcpReceivingSessionWrapper>(info)
29
+ {
30
+ Napi::Env env = info.Env();
31
+ mSessionPtr = std::make_unique<rtc::RtcpReceivingSession>();
32
+ }
33
+
34
+ RtcpReceivingSessionWrapper::~RtcpReceivingSessionWrapper()
35
+ {
36
+ mSessionPtr.reset();
37
+ }
38
+
39
+ std::shared_ptr<rtc::RtcpReceivingSession> RtcpReceivingSessionWrapper::getSessionInstance() { return mSessionPtr; }
40
+
41
+ void RtcpReceivingSessionWrapper::addToChain(const Napi::CallbackInfo &info)
42
+ {
43
+ auto env = info.Env();
44
+ if (info.Length() < 1 || !info[0].IsObject())
45
+ {
46
+ Napi::TypeError::New(env, "Expected a MediaHandler instance").ThrowAsJavaScriptException();
47
+ return;
48
+ }
49
+ auto mediaHandler = asMediaHandler(info[0].As<Napi::Object>());
50
+ if (!mediaHandler)
51
+ {
52
+ Napi::TypeError::New(env, "Expected a MediaHandler instance. If this error is unexpected, please report a bug!")
53
+ .ThrowAsJavaScriptException();
54
+ return;
55
+ }
56
+ mSessionPtr->addToChain(mediaHandler);
57
+ }
@@ -0,0 +1,28 @@
1
+ #ifndef MEDIA_RTCPRECEIVINGSESSION_WRAPPER_H
2
+ #define MEDIA_RTCPRECEIVINGSESSION_WRAPPER_H
3
+
4
+ #include <memory>
5
+ #include <unordered_set>
6
+
7
+ #include <napi.h>
8
+ #include <rtc/rtc.hpp>
9
+
10
+ class RtcpReceivingSessionWrapper : public Napi::ObjectWrap<RtcpReceivingSessionWrapper>
11
+ {
12
+ public:
13
+ static Napi::FunctionReference constructor;
14
+ static Napi::Object Init(Napi::Env env, Napi::Object exports);
15
+ RtcpReceivingSessionWrapper(const Napi::CallbackInfo &info);
16
+ ~RtcpReceivingSessionWrapper();
17
+ std::shared_ptr<rtc::RtcpReceivingSession> getSessionInstance();
18
+
19
+ // Functions
20
+ void addToChain(const Napi::CallbackInfo &info);
21
+
22
+ // Callbacks
23
+
24
+ private:
25
+ std::shared_ptr<rtc::RtcpReceivingSession> mSessionPtr = nullptr;
26
+ };
27
+
28
+ #endif // MEDIA_RTCPRECEIVINGSESSION_WRAPPER_H
@@ -0,0 +1,93 @@
1
+ #include "media-rtcpsrreporter-wrapper.h"
2
+ #include "media-rtppacketizationconfig-wrapper.h"
3
+ #include "media-mediahandler-helper.h"
4
+
5
+ Napi::FunctionReference RtcpSrReporterWrapper::constructor = Napi::FunctionReference();
6
+
7
+ Napi::Object RtcpSrReporterWrapper::Init(Napi::Env env, Napi::Object exports)
8
+ {
9
+ Napi::HandleScope scope(env);
10
+
11
+ Napi::Function func = Napi::ObjectWrap<RtcpSrReporterWrapper>::DefineClass(env, "RtcpSrReporter",
12
+ {
13
+ // Instance Methods
14
+ InstanceMethod("addToChain", &RtcpSrReporterWrapper::addToChain),
15
+ // Accessors
16
+ InstanceAccessor("rtpConfig", &RtcpSrReporterWrapper::getRtpPacketizationConfig, nullptr),
17
+ });
18
+
19
+ // If this is not the first call, we don't want to reassign the constructor (hot-reload problem)
20
+ if (constructor.IsEmpty())
21
+ {
22
+ constructor = Napi::Persistent(func);
23
+ constructor.SuppressDestruct();
24
+ }
25
+
26
+ exports.Set("RtcpSrReporter", func);
27
+ return exports;
28
+ }
29
+
30
+ RtcpSrReporterWrapper::RtcpSrReporterWrapper(const Napi::CallbackInfo &info)
31
+ : Napi::ObjectWrap<RtcpSrReporterWrapper>(info)
32
+ {
33
+ Napi::Env env = info.Env();
34
+
35
+ if (!info[0].IsObject())
36
+ {
37
+ Napi::TypeError::New(env, "Expected a RtpPacketizationConfig object").ThrowAsJavaScriptException();
38
+ return;
39
+ }
40
+
41
+ auto obj = info[0].As<Napi::Object>();
42
+ if (!obj.InstanceOf(RtpPacketizationConfigWrapper::constructor.Value()))
43
+ {
44
+ Napi::TypeError::New(env, "Expected a RtpPacketizationConfig object").ThrowAsJavaScriptException();
45
+ return;
46
+ }
47
+ // store original JS object so we can return it later
48
+ mRtpConfigObject = Napi::Persistent(obj);
49
+ mRtpConfigObject.SuppressDestruct();
50
+ auto config = RtpPacketizationConfigWrapper::Unwrap(obj);
51
+ mReporterPtr = std::make_unique<rtc::RtcpSrReporter>(config->getConfigInstance());
52
+ }
53
+
54
+ RtcpSrReporterWrapper::~RtcpSrReporterWrapper()
55
+ {
56
+ mReporterPtr.reset();
57
+ mRtpConfigObject.Reset();
58
+ }
59
+
60
+ std::shared_ptr<rtc::RtcpSrReporter> RtcpSrReporterWrapper::getReporterInstance() { return mReporterPtr; }
61
+
62
+ void RtcpSrReporterWrapper::addToChain(const Napi::CallbackInfo &info)
63
+ {
64
+ auto env = info.Env();
65
+ if (info.Length() < 1 || !info[0].IsObject())
66
+ {
67
+ Napi::TypeError::New(env, "Expected a MediaHandler instance").ThrowAsJavaScriptException();
68
+ return;
69
+ }
70
+ auto mediaHandler = asMediaHandler(info[0].As<Napi::Object>());
71
+ if (!mediaHandler)
72
+ {
73
+ Napi::TypeError::New(env, "Expected a MediaHandler instance. If this error is unexpected, please report a bug!")
74
+ .ThrowAsJavaScriptException();
75
+ return;
76
+ }
77
+ mReporterPtr->addToChain(mediaHandler);
78
+ }
79
+
80
+ Napi::Value RtcpSrReporterWrapper::getRtpPacketizationConfig(const Napi::CallbackInfo &info)
81
+ {
82
+ Napi::Env env = info.Env();
83
+ if (!mReporterPtr)
84
+ {
85
+ Napi::Error::New(env, "getRtpPacketizationConfig() called on destroyed reporter").ThrowAsJavaScriptException();
86
+ return env.Null();
87
+ }
88
+
89
+ if (mRtpConfigObject.IsEmpty())
90
+ return env.Null();
91
+
92
+ return mRtpConfigObject.Value();
93
+ }
@@ -0,0 +1,30 @@
1
+ #ifndef MEDIA_RTCPSRREPORTER_WRAPPER_H
2
+ #define MEDIA_RTCPSRREPORTER_WRAPPER_H
3
+
4
+ #include <memory>
5
+ #include <unordered_set>
6
+
7
+ #include <napi.h>
8
+ #include <rtc/rtc.hpp>
9
+
10
+ class RtcpSrReporterWrapper : public Napi::ObjectWrap<RtcpSrReporterWrapper>
11
+ {
12
+ public:
13
+ static Napi::FunctionReference constructor;
14
+ static Napi::Object Init(Napi::Env env, Napi::Object exports);
15
+ RtcpSrReporterWrapper(const Napi::CallbackInfo &info);
16
+ ~RtcpSrReporterWrapper();
17
+ std::shared_ptr<rtc::RtcpSrReporter> getReporterInstance();
18
+
19
+ // Functions
20
+ void addToChain(const Napi::CallbackInfo &info);
21
+ Napi::Value getRtpPacketizationConfig(const Napi::CallbackInfo &info);
22
+
23
+ // Callbacks
24
+
25
+ private:
26
+ std::shared_ptr<rtc::RtcpSrReporter> mReporterPtr = nullptr;
27
+ Napi::ObjectReference mRtpConfigObject;
28
+ };
29
+
30
+ #endif // MEDIA_RTCPSRREPORTER_WRAPPER_H
@@ -0,0 +1,167 @@
1
+ #include "media-rtppacketizationconfig-wrapper.h"
2
+
3
+ Napi::FunctionReference RtpPacketizationConfigWrapper::constructor = Napi::FunctionReference();
4
+
5
+ Napi::Object RtpPacketizationConfigWrapper::Init(Napi::Env env, Napi::Object exports)
6
+ {
7
+ Napi::HandleScope scope(env);
8
+
9
+ Napi::Function func = Napi::ObjectWrap<RtpPacketizationConfigWrapper>::DefineClass(env, "RtpPacketizationConfig",
10
+ {
11
+ // Instance Methods
12
+ InstanceAccessor("playoutDelayId",
13
+ &RtpPacketizationConfigWrapper::getPlayoutDelayId,
14
+ &RtpPacketizationConfigWrapper::setPlayoutDelayId
15
+ ),
16
+ InstanceAccessor("playoutDelayMin",
17
+ &RtpPacketizationConfigWrapper::getPlayoutDelayMin,
18
+ &RtpPacketizationConfigWrapper::setPlayoutDelayMin
19
+ ),
20
+ InstanceAccessor("playoutDelayMax",
21
+ &RtpPacketizationConfigWrapper::getPlayoutDelayMax,
22
+ &RtpPacketizationConfigWrapper::setPlayoutDelayMax
23
+ ),
24
+ InstanceAccessor("timestamp",
25
+ &RtpPacketizationConfigWrapper::getTimestamp,
26
+ &RtpPacketizationConfigWrapper::setTimestamp
27
+ ),
28
+ InstanceAccessor("clockRate",
29
+ &RtpPacketizationConfigWrapper::getClockRate,
30
+ nullptr
31
+ ),
32
+ });
33
+
34
+ // If this is not the first call, we don't want to reassign the constructor (hot-reload problem)
35
+ if (constructor.IsEmpty())
36
+ {
37
+ constructor = Napi::Persistent(func);
38
+ constructor.SuppressDestruct();
39
+ }
40
+
41
+ exports.Set("RtpPacketizationConfig", func);
42
+ return exports;
43
+ }
44
+
45
+ RtpPacketizationConfigWrapper::RtpPacketizationConfigWrapper(const Napi::CallbackInfo &info)
46
+ : Napi::ObjectWrap<RtpPacketizationConfigWrapper>(info)
47
+ {
48
+ Napi::Env env = info.Env();
49
+
50
+ if (info.Length() < 4)
51
+ {
52
+ Napi::Error::New(env, "RtpPacketizationConfig constructor requires 4 or 5 parameters").ThrowAsJavaScriptException();
53
+ return;
54
+ }
55
+
56
+ rtc::SSRC ssrc;
57
+ if (!info[0].IsNumber())
58
+ {
59
+ Napi::TypeError::New(env, "ssrc must be a number").ThrowAsJavaScriptException();
60
+ return;
61
+ }
62
+ ssrc = info[0].As<Napi::Number>().Uint32Value();
63
+
64
+ std::string cname;
65
+ if (!info[1].IsString())
66
+ {
67
+ Napi::TypeError::New(env, "cname must be a string").ThrowAsJavaScriptException();
68
+ return;
69
+ }
70
+ cname = info[1].As<Napi::String>().Utf8Value();
71
+
72
+ uint8_t payloadType;
73
+ if (!info[2].IsNumber())
74
+ {
75
+ Napi::TypeError::New(env, "payloadType must be a number").ThrowAsJavaScriptException();
76
+ return;
77
+ }
78
+ payloadType = info[2].As<Napi::Number>().Uint32Value();
79
+
80
+ uint32_t clockRate;
81
+ if (!info[3].IsNumber())
82
+ {
83
+ Napi::TypeError::New(env, "clockRate must be a number").ThrowAsJavaScriptException();
84
+ return;
85
+ }
86
+ clockRate = info[3].As<Napi::Number>().Uint32Value();
87
+
88
+ uint8_t videoOrientationId = 0;
89
+ if (info.Length() >= 5)
90
+ {
91
+ if (!info[4].IsNumber())
92
+ {
93
+ Napi::TypeError::New(env, "videoOrientationId must be a number").ThrowAsJavaScriptException();
94
+ return;
95
+ }
96
+ videoOrientationId = info[4].As<Napi::Number>().Uint32Value();
97
+ }
98
+ mConfigPtr = std::make_unique<rtc::RtpPacketizationConfig>(ssrc, cname, payloadType, clockRate, videoOrientationId);
99
+ }
100
+
101
+ RtpPacketizationConfigWrapper::~RtpPacketizationConfigWrapper()
102
+ {
103
+ mConfigPtr.reset();
104
+ }
105
+
106
+ std::shared_ptr<rtc::RtpPacketizationConfig> RtpPacketizationConfigWrapper::getConfigInstance() { return mConfigPtr; }
107
+
108
+ Napi::Value RtpPacketizationConfigWrapper::getPlayoutDelayId(const Napi::CallbackInfo &info)
109
+ {
110
+ return Napi::Number::New(info.Env(), mConfigPtr->playoutDelayId);
111
+ }
112
+ void RtpPacketizationConfigWrapper::setPlayoutDelayId(const Napi::CallbackInfo &info, const Napi::Value &val)
113
+ {
114
+ auto env = info.Env();
115
+ if (!val.IsNumber())
116
+ {
117
+ Napi::TypeError::New(env, "Expected a number").ThrowAsJavaScriptException();
118
+ return;
119
+ }
120
+ mConfigPtr->playoutDelayId = val.As<Napi::Number>().Uint32Value();
121
+ }
122
+ Napi::Value RtpPacketizationConfigWrapper::getPlayoutDelayMin(const Napi::CallbackInfo &info)
123
+ {
124
+ return Napi::Number::New(info.Env(), mConfigPtr->playoutDelayMin);
125
+ }
126
+ void RtpPacketizationConfigWrapper::setPlayoutDelayMin(const Napi::CallbackInfo &info, const Napi::Value &val)
127
+ {
128
+ auto env = info.Env();
129
+ if (!val.IsNumber())
130
+ {
131
+ Napi::TypeError::New(env, "Expected a number").ThrowAsJavaScriptException();
132
+ return;
133
+ }
134
+ mConfigPtr->playoutDelayMin = val.As<Napi::Number>().Uint32Value();
135
+ }
136
+ Napi::Value RtpPacketizationConfigWrapper::getPlayoutDelayMax(const Napi::CallbackInfo &info)
137
+ {
138
+ return Napi::Number::New(info.Env(), mConfigPtr->playoutDelayMax);
139
+ }
140
+ void RtpPacketizationConfigWrapper::setPlayoutDelayMax(const Napi::CallbackInfo &info, const Napi::Value &val)
141
+ {
142
+ auto env = info.Env();
143
+ if (!val.IsNumber())
144
+ {
145
+ Napi::TypeError::New(env, "Expected a number").ThrowAsJavaScriptException();
146
+ return;
147
+ }
148
+ mConfigPtr->playoutDelayMax = val.As<Napi::Number>().Uint32Value();
149
+ }
150
+ Napi::Value RtpPacketizationConfigWrapper::getTimestamp(const Napi::CallbackInfo &info)
151
+ {
152
+ return Napi::Number::New(info.Env(), mConfigPtr->timestamp);
153
+ }
154
+ void RtpPacketizationConfigWrapper::setTimestamp(const Napi::CallbackInfo &info, const Napi::Value &val)
155
+ {
156
+ auto env = info.Env();
157
+ if (!val.IsNumber())
158
+ {
159
+ Napi::TypeError::New(env, "Expected a number").ThrowAsJavaScriptException();
160
+ return;
161
+ }
162
+ mConfigPtr->timestamp = val.As<Napi::Number>().Uint32Value();
163
+ }
164
+ Napi::Value RtpPacketizationConfigWrapper::getClockRate(const Napi::CallbackInfo &info)
165
+ {
166
+ return Napi::Number::New(info.Env(), mConfigPtr->clockRate);
167
+ }
@@ -0,0 +1,35 @@
1
+ #ifndef MEDIA_RTPPACKETIZATIONCONFIG_WRAPPER_H
2
+ #define MEDIA_RTPPACKETIZATIONCONFIG_WRAPPER_H
3
+
4
+ #include <memory>
5
+ #include <unordered_set>
6
+
7
+ #include <napi.h>
8
+ #include <rtc/rtc.hpp>
9
+
10
+ class RtpPacketizationConfigWrapper : public Napi::ObjectWrap<RtpPacketizationConfigWrapper>
11
+ {
12
+ public:
13
+ static Napi::FunctionReference constructor;
14
+ static Napi::Object Init(Napi::Env env, Napi::Object exports);
15
+ RtpPacketizationConfigWrapper(const Napi::CallbackInfo &info);
16
+ ~RtpPacketizationConfigWrapper();
17
+ std::shared_ptr<rtc::RtpPacketizationConfig> getConfigInstance();
18
+
19
+ // Functions
20
+ Napi::Value getPlayoutDelayId(const Napi::CallbackInfo& info);
21
+ void setPlayoutDelayId(const Napi::CallbackInfo& info, const Napi::Value &val);
22
+ Napi::Value getPlayoutDelayMin(const Napi::CallbackInfo& info);
23
+ void setPlayoutDelayMin(const Napi::CallbackInfo& info, const Napi::Value &val);
24
+ Napi::Value getPlayoutDelayMax(const Napi::CallbackInfo& info);
25
+ void setPlayoutDelayMax(const Napi::CallbackInfo& info, const Napi::Value &val);
26
+ Napi::Value getTimestamp(const Napi::CallbackInfo& info);
27
+ void setTimestamp(const Napi::CallbackInfo& info, const Napi::Value &val);
28
+ Napi::Value getClockRate(const Napi::CallbackInfo& info);
29
+ // Callbacks
30
+
31
+ private:
32
+ std::shared_ptr<rtc::RtpPacketizationConfig> mConfigPtr = nullptr;
33
+ };
34
+
35
+ #endif // MEDIA_RTPPACKETIZATIONCONFIG_WRAPPER_H