react-native-nitro-dgram 0.1.4

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 (74) hide show
  1. package/android/CMakeLists.txt +24 -0
  2. package/android/OnLoad.cpp +6 -0
  3. package/android/build.gradle +64 -0
  4. package/android/libs/arm64-v8a/librust_c_udp.so +0 -0
  5. package/android/libs/armeabi-v7a/librust_c_udp.so +0 -0
  6. package/android/libs/x86/librust_c_udp.so +0 -0
  7. package/android/libs/x86_64/librust_c_udp.so +0 -0
  8. package/android/src/main/java/com/margelo/nitro/udp/NitroUdpPackage.java +25 -0
  9. package/cpp/HybridUdpDriver.cpp +21 -0
  10. package/cpp/HybridUdpDriver.hpp +18 -0
  11. package/cpp/HybridUdpSocketDriver.cpp +252 -0
  12. package/cpp/HybridUdpSocketDriver.hpp +88 -0
  13. package/cpp/UdpBindings.hpp +83 -0
  14. package/cpp/UdpManager.hpp +108 -0
  15. package/ios/Frameworks/RustCUdp.xcframework/Info.plist +44 -0
  16. package/ios/Frameworks/RustCUdp.xcframework/ios-arm64/RustCUdp.framework/Info.plist +20 -0
  17. package/ios/Frameworks/RustCUdp.xcframework/ios-arm64/RustCUdp.framework/RustCUdp +0 -0
  18. package/ios/Frameworks/RustCUdp.xcframework/ios-arm64_x86_64-simulator/RustCUdp.framework/Info.plist +20 -0
  19. package/ios/Frameworks/RustCUdp.xcframework/ios-arm64_x86_64-simulator/RustCUdp.framework/RustCUdp +0 -0
  20. package/lib/Driver.d.ts +2 -0
  21. package/lib/Driver.js +6 -0
  22. package/lib/Driver.js.map +1 -0
  23. package/lib/Udp.nitro.d.ts +54 -0
  24. package/lib/Udp.nitro.js +3 -0
  25. package/lib/Udp.nitro.js.map +1 -0
  26. package/lib/index.d.ts +82 -0
  27. package/lib/index.js +375 -0
  28. package/lib/index.js.map +1 -0
  29. package/nitrogen/generated/.gitattributes +1 -0
  30. package/nitrogen/generated/android/RustCUdp+autolinking.cmake +84 -0
  31. package/nitrogen/generated/android/RustCUdp+autolinking.gradle +27 -0
  32. package/nitrogen/generated/android/RustCUdpOnLoad.cpp +53 -0
  33. package/nitrogen/generated/android/RustCUdpOnLoad.hpp +25 -0
  34. package/nitrogen/generated/android/c++/JFunc_void.hpp +75 -0
  35. package/nitrogen/generated/android/c++/JFunc_void_std__shared_ptr_ArrayBuffer__std__string_double.hpp +78 -0
  36. package/nitrogen/generated/android/c++/JFunc_void_std__string.hpp +76 -0
  37. package/nitrogen/generated/android/c++/JHybridUdpDriverSpec.cpp +57 -0
  38. package/nitrogen/generated/android/c++/JHybridUdpDriverSpec.hpp +65 -0
  39. package/nitrogen/generated/android/c++/JHybridUdpSocketDriverSpec.cpp +261 -0
  40. package/nitrogen/generated/android/c++/JHybridUdpSocketDriverSpec.hpp +97 -0
  41. package/nitrogen/generated/android/kotlin/com/margelo/nitro/udp/Func_void.kt +80 -0
  42. package/nitrogen/generated/android/kotlin/com/margelo/nitro/udp/Func_void_std__shared_ptr_ArrayBuffer__std__string_double.kt +80 -0
  43. package/nitrogen/generated/android/kotlin/com/margelo/nitro/udp/Func_void_std__string.kt +80 -0
  44. package/nitrogen/generated/android/kotlin/com/margelo/nitro/udp/HybridUdpDriverSpec.kt +57 -0
  45. package/nitrogen/generated/android/kotlin/com/margelo/nitro/udp/HybridUdpSocketDriverSpec.kt +212 -0
  46. package/nitrogen/generated/android/kotlin/com/margelo/nitro/udp/RustCUdpOnLoad.kt +35 -0
  47. package/nitrogen/generated/ios/RustCUdp+autolinking.rb +60 -0
  48. package/nitrogen/generated/ios/RustCUdp-Swift-Cxx-Bridge.cpp +74 -0
  49. package/nitrogen/generated/ios/RustCUdp-Swift-Cxx-Bridge.hpp +195 -0
  50. package/nitrogen/generated/ios/RustCUdp-Swift-Cxx-Umbrella.hpp +53 -0
  51. package/nitrogen/generated/ios/RustCUdpAutolinking.mm +35 -0
  52. package/nitrogen/generated/ios/RustCUdpAutolinking.swift +12 -0
  53. package/nitrogen/generated/ios/c++/HybridUdpDriverSpecSwift.cpp +11 -0
  54. package/nitrogen/generated/ios/c++/HybridUdpDriverSpecSwift.hpp +80 -0
  55. package/nitrogen/generated/ios/c++/HybridUdpSocketDriverSpecSwift.cpp +11 -0
  56. package/nitrogen/generated/ios/c++/HybridUdpSocketDriverSpecSwift.hpp +302 -0
  57. package/nitrogen/generated/ios/swift/Func_void.swift +47 -0
  58. package/nitrogen/generated/ios/swift/Func_void_std__shared_ptr_ArrayBuffer__std__string_double.swift +47 -0
  59. package/nitrogen/generated/ios/swift/Func_void_std__string.swift +47 -0
  60. package/nitrogen/generated/ios/swift/HybridUdpDriverSpec.swift +56 -0
  61. package/nitrogen/generated/ios/swift/HybridUdpDriverSpec_cxx.swift +141 -0
  62. package/nitrogen/generated/ios/swift/HybridUdpSocketDriverSpec.swift +84 -0
  63. package/nitrogen/generated/ios/swift/HybridUdpSocketDriverSpec_cxx.swift +527 -0
  64. package/nitrogen/generated/shared/c++/HybridNitroBufferSpec.cpp +32 -0
  65. package/nitrogen/generated/shared/c++/HybridNitroBufferSpec.hpp +74 -0
  66. package/nitrogen/generated/shared/c++/HybridUdpDriverSpec.cpp +21 -0
  67. package/nitrogen/generated/shared/c++/HybridUdpDriverSpec.hpp +66 -0
  68. package/nitrogen/generated/shared/c++/HybridUdpSocketDriverSpec.cpp +54 -0
  69. package/nitrogen/generated/shared/c++/HybridUdpSocketDriverSpec.hpp +98 -0
  70. package/package.json +59 -0
  71. package/react-native-nitro-dgram.podspec +45 -0
  72. package/src/Driver.ts +4 -0
  73. package/src/Udp.nitro.ts +55 -0
  74. package/src/index.ts +414 -0
@@ -0,0 +1,24 @@
1
+ cmake_minimum_required(VERSION 3.9.0)
2
+ project(RustCUdp)
3
+
4
+ set(PACKAGE_NAME RustCUdp)
5
+ set(CMAKE_VERBOSE_MAKEFILE ON)
6
+ set(CMAKE_CXX_STANDARD 20)
7
+
8
+ add_library(${PACKAGE_NAME} SHARED
9
+ ../cpp/HybridUdpDriver.cpp
10
+ ../cpp/HybridUdpSocketDriver.cpp
11
+ OnLoad.cpp
12
+ )
13
+
14
+ include_directories(
15
+ ${CMAKE_CURRENT_SOURCE_DIR}/../cpp
16
+ )
17
+
18
+ include(${CMAKE_CURRENT_SOURCE_DIR}/../nitrogen/generated/android/RustCUdp+autolinking.cmake)
19
+
20
+ target_link_directories(${PACKAGE_NAME} PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}/libs/${ANDROID_ABI})
21
+ target_link_libraries(${PACKAGE_NAME}
22
+ rust_c_udp
23
+ log
24
+ )
@@ -0,0 +1,6 @@
1
+ #include "RustCUdpOnLoad.hpp"
2
+ #include <jni.h>
3
+
4
+ JNIEXPORT jint JNICALL JNI_OnLoad(JavaVM *vm, void *) {
5
+ return margelo::nitro::udp::initialize(vm);
6
+ }
@@ -0,0 +1,64 @@
1
+ apply plugin: 'com.android.library'
2
+ apply plugin: 'org.jetbrains.kotlin.android'
3
+
4
+ def reactNativeArchitectures() {
5
+ def value = rootProject.getProperties().get("reactNativeArchitectures")
6
+ return value ? value.split(",") : ["armeabi-v7a", "x86", "x86_64", "arm64-v8a"]
7
+ }
8
+
9
+ def getExtOrDefault(name, defaultValue) {
10
+ return rootProject.ext.has(name) ? rootProject.ext.get(name) : defaultValue
11
+ }
12
+
13
+ android {
14
+ namespace "com.margelo.nitro.udp"
15
+ ndkVersion getExtOrDefault("ndkVersion", "27.1.12297006")
16
+ compileSdkVersion getExtOrDefault('compileSdkVersion', 35)
17
+
18
+ defaultConfig {
19
+ minSdkVersion getExtOrDefault('minSdkVersion', 21)
20
+ targetSdkVersion getExtOrDefault('targetSdkVersion', 35)
21
+
22
+ externalNativeBuild {
23
+ cmake {
24
+ cppFlags "-fexceptions", "-frtti", "-std=c++20"
25
+ arguments "-DANDROID_STL=c++_shared"
26
+ abiFilters (*reactNativeArchitectures())
27
+ }
28
+ }
29
+ }
30
+
31
+ buildFeatures {
32
+ buildConfig true
33
+ prefab true
34
+ }
35
+
36
+ sourceSets {
37
+ main {
38
+ jniLibs.srcDirs += ['libs']
39
+ }
40
+ }
41
+
42
+ externalNativeBuild {
43
+ cmake {
44
+ path "CMakeLists.txt"
45
+ }
46
+ }
47
+
48
+ packagingOptions {
49
+ excludes += [
50
+ "**/libc++_shared.so",
51
+ "**/libjsi.so",
52
+ "**/libreactnativejni.so",
53
+ "**/libreact_nativemodule_core.so",
54
+ "**/libturbomodulejsijni.so"
55
+ ]
56
+ }
57
+ }
58
+
59
+ dependencies {
60
+ implementation "com.facebook.react:react-native:+"
61
+ implementation project(':react-native-nitro-modules')
62
+ }
63
+
64
+ apply from: "../nitrogen/generated/android/RustCUdp+autolinking.gradle"
@@ -0,0 +1,25 @@
1
+ package com.margelo.nitro.udp;
2
+
3
+ import androidx.annotation.NonNull;
4
+ import com.facebook.react.ReactPackage;
5
+ import com.facebook.react.bridge.NativeModule;
6
+ import com.facebook.react.bridge.ReactApplicationContext;
7
+ import com.facebook.react.uimanager.ViewManager;
8
+ import java.util.Collections;
9
+ import java.util.List;
10
+
11
+ public class NitroUdpPackage implements ReactPackage {
12
+ @NonNull
13
+ @Override
14
+ public List<NativeModule> createNativeModules(@NonNull ReactApplicationContext reactContext) {
15
+ // Initialize the native library
16
+ RustCUdpOnLoad.initializeNative();
17
+ return Collections.emptyList();
18
+ }
19
+
20
+ @NonNull
21
+ @Override
22
+ public List<ViewManager> createViewManagers(@NonNull ReactApplicationContext reactContext) {
23
+ return Collections.emptyList();
24
+ }
25
+ }
@@ -0,0 +1,21 @@
1
+ #include "HybridUdpDriver.hpp"
2
+ #include "HybridUdpSocketDriver.hpp"
3
+
4
+ namespace margelo::nitro::udp {
5
+
6
+ HybridUdpDriver::HybridUdpDriver() : HybridObject(TAG) {}
7
+
8
+ std::shared_ptr<HybridUdpSocketDriverSpec>
9
+ HybridUdpDriver::createSocket(const std::optional<std::string> &id) {
10
+ if (id.has_value()) {
11
+ try {
12
+ uint32_t socketId = static_cast<uint32_t>(std::stoul(id.value()));
13
+ return std::make_shared<HybridUdpSocketDriver>(socketId);
14
+ } catch (...) {
15
+ // Fallback
16
+ }
17
+ }
18
+ return std::make_shared<HybridUdpSocketDriver>();
19
+ }
20
+
21
+ } // namespace margelo::nitro::udp
@@ -0,0 +1,18 @@
1
+ #pragma once
2
+
3
+ #include "../nitrogen/generated/shared/c++/HybridUdpDriverSpec.hpp"
4
+ #include <memory>
5
+ #include <optional>
6
+ #include <string>
7
+
8
+ namespace margelo::nitro::udp {
9
+
10
+ class HybridUdpDriver : public HybridUdpDriverSpec {
11
+ public:
12
+ HybridUdpDriver();
13
+
14
+ std::shared_ptr<HybridUdpSocketDriverSpec>
15
+ createSocket(const std::optional<std::string> &id) override;
16
+ };
17
+
18
+ } // namespace margelo::nitro::udp
@@ -0,0 +1,252 @@
1
+ #include "HybridUdpSocketDriver.hpp"
2
+ #include "UdpManager.hpp"
3
+
4
+ namespace margelo::nitro::udp {
5
+
6
+ HybridUdpSocketDriver::HybridUdpSocketDriver() : HybridObject(TAG) {
7
+ _id = ::udp::udp_create();
8
+ _originalId = _id;
9
+ UdpManager::shared().registerHandler(
10
+ _id, [this](int type, const uint8_t *data, size_t len,
11
+ const std::string &address, int port) {
12
+ this->onNativeEvent(type, data, len, address, port);
13
+ });
14
+ }
15
+
16
+ HybridUdpSocketDriver::HybridUdpSocketDriver(uint32_t id)
17
+ : HybridObject(TAG), _id(id), _originalId(id) {
18
+ UdpManager::shared().registerHandler(
19
+ _id, [this](int type, const uint8_t *data, size_t len,
20
+ const std::string &address, int port) {
21
+ this->onNativeEvent(type, data, len, address, port);
22
+ });
23
+ }
24
+
25
+ HybridUdpSocketDriver::~HybridUdpSocketDriver() { close(); }
26
+
27
+ double HybridUdpSocketDriver::getId() { return static_cast<double>(_id); }
28
+
29
+ std::function<void(const std::shared_ptr<ArrayBuffer> &, const std::string &,
30
+ double)>
31
+ HybridUdpSocketDriver::getOnMessage() {
32
+ return _onMessage;
33
+ }
34
+ void HybridUdpSocketDriver::setOnMessage(
35
+ const std::function<void(const std::shared_ptr<ArrayBuffer> &,
36
+ const std::string &, double)> &onMessage) {
37
+ _onMessage = onMessage;
38
+ }
39
+
40
+ std::function<void(const std::string &)> HybridUdpSocketDriver::getOnError() {
41
+ return _onError;
42
+ }
43
+ void HybridUdpSocketDriver::setOnError(
44
+ const std::function<void(const std::string &)> &onError) {
45
+ _onError = onError;
46
+ }
47
+
48
+ std::function<void()> HybridUdpSocketDriver::getOnClose() { return _onClose; }
49
+ void HybridUdpSocketDriver::setOnClose(const std::function<void()> &onClose) {
50
+ _onClose = onClose;
51
+ }
52
+
53
+ double HybridUdpSocketDriver::bind(double port, const std::string &address,
54
+ bool ipv6Only) {
55
+ return static_cast<double>(
56
+ ::udp::udp_bind(_id, address.empty() ? nullptr : address.c_str(),
57
+ static_cast<int>(port), ipv6Only));
58
+ }
59
+
60
+ double HybridUdpSocketDriver::connect(double port, const std::string &address) {
61
+ return static_cast<double>(
62
+ ::udp::udp_connect(_id, address.c_str(), static_cast<int>(port)));
63
+ }
64
+
65
+ double HybridUdpSocketDriver::disconnect() {
66
+ return static_cast<double>(::udp::udp_disconnect(_id));
67
+ }
68
+
69
+ double HybridUdpSocketDriver::send(const std::shared_ptr<ArrayBuffer> &data,
70
+ double port, const std::string &address) {
71
+ if (!data)
72
+ return -1;
73
+ return static_cast<double>(::udp::udp_send(_id, data->data(), data->size(),
74
+ address.c_str(),
75
+ static_cast<int>(port)));
76
+ }
77
+
78
+ double HybridUdpSocketDriver::sendMultiple(
79
+ const std::vector<std::shared_ptr<ArrayBuffer>> &data, double port,
80
+ const std::string &address) {
81
+ if (data.empty())
82
+ return 0;
83
+
84
+ std::vector<const uint8_t *> datas;
85
+ std::vector<size_t> lens;
86
+ datas.reserve(data.size());
87
+ lens.reserve(data.size());
88
+
89
+ for (const auto &buffer : data) {
90
+ if (buffer) {
91
+ datas.push_back(buffer->data());
92
+ lens.push_back(buffer->size());
93
+ }
94
+ }
95
+
96
+ if (datas.empty())
97
+ return 0;
98
+
99
+ return static_cast<double>(
100
+ ::udp::udp_send_multiple(_id, datas.data(), lens.data(), datas.size(),
101
+ address.c_str(), static_cast<int>(port)));
102
+ }
103
+
104
+ void HybridUdpSocketDriver::close() {
105
+ if (_id != 0) {
106
+ ::udp::udp_close(_id);
107
+ // NOTE: Do NOT unregister handler here!
108
+ // The handler will be unregistered when EVENT_CLOSE is received in
109
+ // onNativeEvent. This ensures the close event can be properly delivered to
110
+ // JS layer.
111
+ _id = 0;
112
+ }
113
+ }
114
+
115
+ double HybridUdpSocketDriver::setBroadcast(bool flag) {
116
+ return static_cast<double>(::udp::udp_set_broadcast(_id, flag));
117
+ }
118
+ double HybridUdpSocketDriver::setTTL(double ttl) {
119
+ return static_cast<double>(
120
+ ::udp::udp_set_ttl(_id, static_cast<uint32_t>(ttl)));
121
+ }
122
+ double HybridUdpSocketDriver::setMulticastTTL(double ttl) {
123
+ return static_cast<double>(
124
+ ::udp::udp_set_multicast_ttl_v4(_id, static_cast<uint32_t>(ttl)));
125
+ }
126
+ double HybridUdpSocketDriver::setMulticastLoopback(bool flag) {
127
+ return static_cast<double>(::udp::udp_set_multicast_loop_v4(_id, flag));
128
+ }
129
+ double HybridUdpSocketDriver::setMulticastInterface(
130
+ const std::string &interfaceAddress) {
131
+ return -1;
132
+ }
133
+ double HybridUdpSocketDriver::addMembership(
134
+ const std::string &multicastAddress,
135
+ const std::optional<std::string> &interfaceAddress) {
136
+ return -1;
137
+ }
138
+ double HybridUdpSocketDriver::dropMembership(
139
+ const std::string &multicastAddress,
140
+ const std::optional<std::string> &interfaceAddress) {
141
+ return -1;
142
+ }
143
+
144
+ double HybridUdpSocketDriver::addSourceSpecificMembership(
145
+ const std::string &sourceAddress, const std::string &groupAddress,
146
+ const std::optional<std::string> &interfaceAddress) {
147
+ return static_cast<double>(::udp::udp_add_source_specific_membership(
148
+ _id, sourceAddress.c_str(), groupAddress.c_str(),
149
+ interfaceAddress.has_value() ? interfaceAddress.value().c_str()
150
+ : nullptr));
151
+ }
152
+
153
+ double HybridUdpSocketDriver::dropSourceSpecificMembership(
154
+ const std::string &sourceAddress, const std::string &groupAddress,
155
+ const std::optional<std::string> &interfaceAddress) {
156
+ return static_cast<double>(::udp::udp_drop_source_specific_membership(
157
+ _id, sourceAddress.c_str(), groupAddress.c_str(),
158
+ interfaceAddress.has_value() ? interfaceAddress.value().c_str()
159
+ : nullptr));
160
+ }
161
+
162
+ std::string HybridUdpSocketDriver::getLocalAddress() {
163
+ char buf[256];
164
+ if (::udp::udp_get_local_addr(_id, buf, sizeof(buf)) == 0) {
165
+ return std::string(buf);
166
+ }
167
+ return "";
168
+ }
169
+
170
+ double HybridUdpSocketDriver::getLocalPort() {
171
+ return static_cast<double>(::udp::udp_get_local_port(_id));
172
+ }
173
+
174
+ std::string HybridUdpSocketDriver::getRemoteAddress() {
175
+ char buf[256];
176
+ if (::udp::udp_get_peer_addr(_id, buf, sizeof(buf)) == 0) {
177
+ return std::string(buf);
178
+ }
179
+ return "";
180
+ }
181
+
182
+ double HybridUdpSocketDriver::getRemotePort() {
183
+ return static_cast<double>(::udp::udp_get_peer_port(_id));
184
+ }
185
+
186
+ double HybridUdpSocketDriver::getRecvBufferSize() {
187
+ return static_cast<double>(::udp::udp_get_buffer_size(_id, false));
188
+ }
189
+
190
+ double HybridUdpSocketDriver::setRecvBufferSize(double size) {
191
+ return static_cast<double>(
192
+ ::udp::udp_set_buffer_size(_id, false, static_cast<int>(size)));
193
+ }
194
+
195
+ double HybridUdpSocketDriver::getSendBufferSize() {
196
+ return static_cast<double>(::udp::udp_get_buffer_size(_id, true));
197
+ }
198
+
199
+ double HybridUdpSocketDriver::setSendBufferSize(double size) {
200
+ return static_cast<double>(
201
+ ::udp::udp_set_buffer_size(_id, true, static_cast<int>(size)));
202
+ }
203
+
204
+ double HybridUdpSocketDriver::getSendQueueCount() {
205
+ return static_cast<double>(::udp::udp_get_send_queue_count(_id));
206
+ }
207
+
208
+ double HybridUdpSocketDriver::getSendQueueSize() {
209
+ return static_cast<double>(::udp::udp_get_send_queue_size(_id));
210
+ }
211
+
212
+ std::function<void()> HybridUdpSocketDriver::getOnConnect() {
213
+ return _onConnect;
214
+ }
215
+ void HybridUdpSocketDriver::setOnConnect(
216
+ const std::function<void()> &onConnect) {
217
+ _onConnect = onConnect;
218
+ }
219
+
220
+ void HybridUdpSocketDriver::onNativeEvent(int type, const uint8_t *data,
221
+ size_t len,
222
+ const std::string &address,
223
+ int port) {
224
+ switch (type) {
225
+ case 1: // DATA
226
+ if (_onMessage) {
227
+ auto ab = ArrayBuffer::copy(data, len);
228
+ _onMessage(ab, address, static_cast<double>(port));
229
+ }
230
+ break;
231
+ case 2: // ERROR
232
+ if (_onError) {
233
+ _onError(data ? std::string(reinterpret_cast<const char *>(data), len)
234
+ : "Unknown error");
235
+ }
236
+ break;
237
+ case 3: // CLOSE
238
+ // Unregister handler now that we've received the close event
239
+ UdpManager::shared().unregisterHandler(_originalId);
240
+ if (_onClose) {
241
+ _onClose();
242
+ }
243
+ break;
244
+ case 4: // CONNECT
245
+ if (_onConnect) {
246
+ _onConnect();
247
+ }
248
+ break;
249
+ }
250
+ }
251
+
252
+ } // namespace margelo::nitro::udp
@@ -0,0 +1,88 @@
1
+ #pragma once
2
+
3
+ #include "../nitrogen/generated/shared/c++/HybridUdpSocketDriverSpec.hpp"
4
+ #include "UdpBindings.hpp"
5
+ #include <NitroModules/ArrayBuffer.hpp>
6
+ #include <string>
7
+
8
+ namespace margelo::nitro::udp {
9
+
10
+ using namespace margelo::nitro;
11
+
12
+ class HybridUdpSocketDriver : public HybridUdpSocketDriverSpec {
13
+ public:
14
+ HybridUdpSocketDriver();
15
+ explicit HybridUdpSocketDriver(uint32_t id);
16
+ ~HybridUdpSocketDriver() override;
17
+
18
+ // Properties
19
+ double getId() override;
20
+ std::function<void(const std::shared_ptr<ArrayBuffer> &, const std::string &,
21
+ double)>
22
+ getOnMessage() override;
23
+ void setOnMessage(
24
+ const std::function<void(const std::shared_ptr<ArrayBuffer> &,
25
+ const std::string &, double)> &onMessage)
26
+ override;
27
+ std::function<void(const std::string &)> getOnError() override;
28
+ void
29
+ setOnError(const std::function<void(const std::string &)> &onError) override;
30
+ std::function<void()> getOnClose() override;
31
+ void setOnClose(const std::function<void()> &onClose) override;
32
+
33
+ // Methods
34
+ double bind(double port, const std::string &address, bool ipv6Only) override;
35
+ double connect(double port, const std::string &address) override;
36
+ double disconnect() override;
37
+ double send(const std::shared_ptr<ArrayBuffer> &data, double port,
38
+ const std::string &address) override;
39
+ double sendMultiple(const std::vector<std::shared_ptr<ArrayBuffer>> &data,
40
+ double port, const std::string &address) override;
41
+ void close() override;
42
+ double setBroadcast(bool flag) override;
43
+ double setTTL(double ttl) override;
44
+ double setMulticastTTL(double ttl) override;
45
+ double setMulticastLoopback(bool flag) override;
46
+ double setMulticastInterface(const std::string &interfaceAddress) override;
47
+ double
48
+ addMembership(const std::string &multicastAddress,
49
+ const std::optional<std::string> &interfaceAddress) override;
50
+ double
51
+ dropMembership(const std::string &multicastAddress,
52
+ const std::optional<std::string> &interfaceAddress) override;
53
+ double addSourceSpecificMembership(
54
+ const std::string &sourceAddress, const std::string &groupAddress,
55
+ const std::optional<std::string> &interfaceAddress) override;
56
+ double dropSourceSpecificMembership(
57
+ const std::string &sourceAddress, const std::string &groupAddress,
58
+ const std::optional<std::string> &interfaceAddress) override;
59
+ std::string getLocalAddress() override;
60
+ double getLocalPort() override;
61
+ std::string getRemoteAddress() override;
62
+ double getRemotePort() override;
63
+
64
+ double getRecvBufferSize() override;
65
+ double setRecvBufferSize(double size) override;
66
+ double getSendBufferSize() override;
67
+ double setSendBufferSize(double size) override;
68
+ double getSendQueueCount() override;
69
+ double getSendQueueSize() override;
70
+
71
+ std::function<void()> getOnConnect() override;
72
+ void setOnConnect(const std::function<void()> &onConnect) override;
73
+
74
+ private:
75
+ void onNativeEvent(int type, const uint8_t *data, size_t len,
76
+ const std::string &address, int port);
77
+
78
+ uint32_t _id;
79
+ uint32_t _originalId; // Preserved for handler cleanup after close()
80
+ std::function<void(const std::shared_ptr<ArrayBuffer> &, const std::string &,
81
+ double)>
82
+ _onMessage;
83
+ std::function<void()> _onConnect;
84
+ std::function<void(const std::string &)> _onError;
85
+ std::function<void()> _onClose;
86
+ };
87
+
88
+ } // namespace margelo::nitro::udp
@@ -0,0 +1,83 @@
1
+ #ifndef UDP_BINDINGS_H
2
+ #define UDP_BINDINGS_H
3
+
4
+ #include <cstdarg>
5
+ #include <cstdint>
6
+ #include <cstdlib>
7
+ #include <ostream>
8
+ #include <new>
9
+
10
+ namespace udp {
11
+
12
+ using CallbackPtr = void(*)(uint32_t id,
13
+ int event_type,
14
+ const uint8_t *data,
15
+ uintptr_t len,
16
+ const char *address,
17
+ int port,
18
+ void *context);
19
+
20
+ extern "C" {
21
+
22
+ void udp_init(CallbackPtr callback, void *context);
23
+
24
+ void udp_init_with_config(CallbackPtr callback, void *context, uint32_t worker_threads);
25
+
26
+ uint32_t udp_create();
27
+
28
+ int32_t udp_bind(uint32_t id, const char *host, int port, bool ipv6_only);
29
+
30
+ int32_t udp_send(uint32_t id, const uint8_t *data, uintptr_t len, const char *host, int port);
31
+
32
+ int32_t udp_get_send_queue_count(uint32_t id);
33
+
34
+ int32_t udp_get_send_queue_size(uint32_t id);
35
+
36
+ int32_t udp_send_multiple(uint32_t id,
37
+ const uint8_t *const *datas,
38
+ const uintptr_t *lens,
39
+ uintptr_t count,
40
+ const char *host,
41
+ int port);
42
+
43
+ int32_t udp_connect(uint32_t id, const char *host, int port);
44
+
45
+ int32_t udp_get_buffer_size(uint32_t id, bool is_send);
46
+
47
+ int32_t udp_set_buffer_size(uint32_t id, bool is_send, int32_t size);
48
+
49
+ int32_t udp_disconnect(uint32_t _id);
50
+
51
+ void udp_close(uint32_t id);
52
+
53
+ int32_t udp_set_broadcast(uint32_t id, bool flag);
54
+
55
+ int32_t udp_set_ttl(uint32_t id, uint32_t ttl);
56
+
57
+ int32_t udp_set_multicast_ttl_v4(uint32_t id, uint32_t ttl);
58
+
59
+ int32_t udp_set_multicast_loop_v4(uint32_t id, bool flag);
60
+
61
+ int32_t udp_get_local_addr(uint32_t id, char *buf, uintptr_t max_len);
62
+
63
+ int32_t udp_get_local_port(uint32_t id);
64
+
65
+ int32_t udp_get_peer_addr(uint32_t id, char *buf, uintptr_t max_len);
66
+
67
+ int32_t udp_get_peer_port(uint32_t id);
68
+
69
+ int32_t udp_add_source_specific_membership(uint32_t id,
70
+ const char *source_addr,
71
+ const char *group_addr,
72
+ const char *interface_addr);
73
+
74
+ int32_t udp_drop_source_specific_membership(uint32_t id,
75
+ const char *source_addr,
76
+ const char *group_addr,
77
+ const char *interface_addr);
78
+
79
+ } // extern "C"
80
+
81
+ } // namespace udp
82
+
83
+ #endif // UDP_BINDINGS_H