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.
- package/android/CMakeLists.txt +24 -0
- package/android/OnLoad.cpp +6 -0
- package/android/build.gradle +64 -0
- package/android/libs/arm64-v8a/librust_c_udp.so +0 -0
- package/android/libs/armeabi-v7a/librust_c_udp.so +0 -0
- package/android/libs/x86/librust_c_udp.so +0 -0
- package/android/libs/x86_64/librust_c_udp.so +0 -0
- package/android/src/main/java/com/margelo/nitro/udp/NitroUdpPackage.java +25 -0
- package/cpp/HybridUdpDriver.cpp +21 -0
- package/cpp/HybridUdpDriver.hpp +18 -0
- package/cpp/HybridUdpSocketDriver.cpp +252 -0
- package/cpp/HybridUdpSocketDriver.hpp +88 -0
- package/cpp/UdpBindings.hpp +83 -0
- package/cpp/UdpManager.hpp +108 -0
- package/ios/Frameworks/RustCUdp.xcframework/Info.plist +44 -0
- package/ios/Frameworks/RustCUdp.xcframework/ios-arm64/RustCUdp.framework/Info.plist +20 -0
- package/ios/Frameworks/RustCUdp.xcframework/ios-arm64/RustCUdp.framework/RustCUdp +0 -0
- package/ios/Frameworks/RustCUdp.xcframework/ios-arm64_x86_64-simulator/RustCUdp.framework/Info.plist +20 -0
- package/ios/Frameworks/RustCUdp.xcframework/ios-arm64_x86_64-simulator/RustCUdp.framework/RustCUdp +0 -0
- package/lib/Driver.d.ts +2 -0
- package/lib/Driver.js +6 -0
- package/lib/Driver.js.map +1 -0
- package/lib/Udp.nitro.d.ts +54 -0
- package/lib/Udp.nitro.js +3 -0
- package/lib/Udp.nitro.js.map +1 -0
- package/lib/index.d.ts +82 -0
- package/lib/index.js +375 -0
- package/lib/index.js.map +1 -0
- package/nitrogen/generated/.gitattributes +1 -0
- package/nitrogen/generated/android/RustCUdp+autolinking.cmake +84 -0
- package/nitrogen/generated/android/RustCUdp+autolinking.gradle +27 -0
- package/nitrogen/generated/android/RustCUdpOnLoad.cpp +53 -0
- package/nitrogen/generated/android/RustCUdpOnLoad.hpp +25 -0
- package/nitrogen/generated/android/c++/JFunc_void.hpp +75 -0
- package/nitrogen/generated/android/c++/JFunc_void_std__shared_ptr_ArrayBuffer__std__string_double.hpp +78 -0
- package/nitrogen/generated/android/c++/JFunc_void_std__string.hpp +76 -0
- package/nitrogen/generated/android/c++/JHybridUdpDriverSpec.cpp +57 -0
- package/nitrogen/generated/android/c++/JHybridUdpDriverSpec.hpp +65 -0
- package/nitrogen/generated/android/c++/JHybridUdpSocketDriverSpec.cpp +261 -0
- package/nitrogen/generated/android/c++/JHybridUdpSocketDriverSpec.hpp +97 -0
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/udp/Func_void.kt +80 -0
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/udp/Func_void_std__shared_ptr_ArrayBuffer__std__string_double.kt +80 -0
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/udp/Func_void_std__string.kt +80 -0
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/udp/HybridUdpDriverSpec.kt +57 -0
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/udp/HybridUdpSocketDriverSpec.kt +212 -0
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/udp/RustCUdpOnLoad.kt +35 -0
- package/nitrogen/generated/ios/RustCUdp+autolinking.rb +60 -0
- package/nitrogen/generated/ios/RustCUdp-Swift-Cxx-Bridge.cpp +74 -0
- package/nitrogen/generated/ios/RustCUdp-Swift-Cxx-Bridge.hpp +195 -0
- package/nitrogen/generated/ios/RustCUdp-Swift-Cxx-Umbrella.hpp +53 -0
- package/nitrogen/generated/ios/RustCUdpAutolinking.mm +35 -0
- package/nitrogen/generated/ios/RustCUdpAutolinking.swift +12 -0
- package/nitrogen/generated/ios/c++/HybridUdpDriverSpecSwift.cpp +11 -0
- package/nitrogen/generated/ios/c++/HybridUdpDriverSpecSwift.hpp +80 -0
- package/nitrogen/generated/ios/c++/HybridUdpSocketDriverSpecSwift.cpp +11 -0
- package/nitrogen/generated/ios/c++/HybridUdpSocketDriverSpecSwift.hpp +302 -0
- package/nitrogen/generated/ios/swift/Func_void.swift +47 -0
- package/nitrogen/generated/ios/swift/Func_void_std__shared_ptr_ArrayBuffer__std__string_double.swift +47 -0
- package/nitrogen/generated/ios/swift/Func_void_std__string.swift +47 -0
- package/nitrogen/generated/ios/swift/HybridUdpDriverSpec.swift +56 -0
- package/nitrogen/generated/ios/swift/HybridUdpDriverSpec_cxx.swift +141 -0
- package/nitrogen/generated/ios/swift/HybridUdpSocketDriverSpec.swift +84 -0
- package/nitrogen/generated/ios/swift/HybridUdpSocketDriverSpec_cxx.swift +527 -0
- package/nitrogen/generated/shared/c++/HybridNitroBufferSpec.cpp +32 -0
- package/nitrogen/generated/shared/c++/HybridNitroBufferSpec.hpp +74 -0
- package/nitrogen/generated/shared/c++/HybridUdpDriverSpec.cpp +21 -0
- package/nitrogen/generated/shared/c++/HybridUdpDriverSpec.hpp +66 -0
- package/nitrogen/generated/shared/c++/HybridUdpSocketDriverSpec.cpp +54 -0
- package/nitrogen/generated/shared/c++/HybridUdpSocketDriverSpec.hpp +98 -0
- package/package.json +59 -0
- package/react-native-nitro-dgram.podspec +45 -0
- package/src/Driver.ts +4 -0
- package/src/Udp.nitro.ts +55 -0
- 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,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"
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
@@ -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
|