@annadata/capacitor-mqtt-quic 0.1.8 → 0.1.9
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/build-wolfssl.sh +8 -2
- package/android/install/nghttp3-android/arm64-v8a/lib/libnghttp3.a +0 -0
- package/android/install/nghttp3-android/arm64-v8a/lib/libnghttp3.so +0 -0
- package/android/install/nghttp3-android/arm64-v8a/lib/pkgconfig/libnghttp3.pc +4 -4
- package/android/install/nghttp3-android/armeabi-v7a/lib/libnghttp3.a +0 -0
- package/android/install/nghttp3-android/armeabi-v7a/lib/libnghttp3.so +0 -0
- package/android/install/nghttp3-android/armeabi-v7a/lib/pkgconfig/libnghttp3.pc +4 -4
- package/android/install/nghttp3-android/x86_64/lib/libnghttp3.a +0 -0
- package/android/install/nghttp3-android/x86_64/lib/libnghttp3.so +0 -0
- package/android/install/nghttp3-android/x86_64/lib/pkgconfig/libnghttp3.pc +4 -4
- package/android/install/ngtcp2-android/arm64-v8a/lib/libngtcp2.a +0 -0
- package/android/install/ngtcp2-android/arm64-v8a/lib/libngtcp2.so +0 -0
- package/android/install/ngtcp2-android/arm64-v8a/lib/libngtcp2_crypto_wolfssl.a +0 -0
- package/android/install/ngtcp2-android/arm64-v8a/lib/libngtcp2_crypto_wolfssl.so +0 -0
- package/android/install/ngtcp2-android/arm64-v8a/lib/pkgconfig/libngtcp2.pc +4 -4
- package/android/install/ngtcp2-android/arm64-v8a/lib/pkgconfig/libngtcp2_crypto_wolfssl.pc +4 -4
- package/android/install/ngtcp2-android/armeabi-v7a/lib/libngtcp2.a +0 -0
- package/android/install/ngtcp2-android/armeabi-v7a/lib/libngtcp2.so +0 -0
- package/android/install/ngtcp2-android/armeabi-v7a/lib/libngtcp2_crypto_wolfssl.a +0 -0
- package/android/install/ngtcp2-android/armeabi-v7a/lib/libngtcp2_crypto_wolfssl.so +0 -0
- package/android/install/ngtcp2-android/armeabi-v7a/lib/pkgconfig/libngtcp2.pc +4 -4
- package/android/install/ngtcp2-android/armeabi-v7a/lib/pkgconfig/libngtcp2_crypto_wolfssl.pc +4 -4
- package/android/install/ngtcp2-android/x86_64/lib/libngtcp2.a +0 -0
- package/android/install/ngtcp2-android/x86_64/lib/libngtcp2.so +0 -0
- package/android/install/ngtcp2-android/x86_64/lib/libngtcp2_crypto_wolfssl.a +0 -0
- package/android/install/ngtcp2-android/x86_64/lib/libngtcp2_crypto_wolfssl.so +0 -0
- package/android/install/ngtcp2-android/x86_64/lib/pkgconfig/libngtcp2.pc +4 -4
- package/android/install/ngtcp2-android/x86_64/lib/pkgconfig/libngtcp2_crypto_wolfssl.pc +4 -4
- package/android/install/wolfssl-android/arm64-v8a/bin/wolfssl-config +1 -1
- package/android/install/wolfssl-android/arm64-v8a/lib/libwolfssl.a +0 -0
- package/android/install/wolfssl-android/arm64-v8a/lib/libwolfssl.la +1 -1
- package/android/install/wolfssl-android/arm64-v8a/lib/pkgconfig/wolfssl.pc +1 -1
- package/android/install/wolfssl-android/armeabi-v7a/bin/wolfssl-config +1 -1
- package/android/install/wolfssl-android/armeabi-v7a/lib/libwolfssl.a +0 -0
- package/android/install/wolfssl-android/armeabi-v7a/lib/libwolfssl.la +1 -1
- package/android/install/wolfssl-android/armeabi-v7a/lib/pkgconfig/wolfssl.pc +1 -1
- package/android/install/wolfssl-android/x86_64/bin/wolfssl-config +1 -1
- package/android/install/wolfssl-android/x86_64/lib/libwolfssl.a +0 -0
- package/android/install/wolfssl-android/x86_64/lib/libwolfssl.la +1 -1
- package/android/install/wolfssl-android/x86_64/lib/pkgconfig/wolfssl.pc +1 -1
- package/android/src/main/cpp/ngtcp2_jni.cpp +94 -19
- package/android/src/main/kotlin/ai/annadata/mqttquic/MqttQuicPlugin.kt +58 -3
- package/android/src/main/kotlin/ai/annadata/mqttquic/client/MQTTClient.kt +230 -80
- package/android/src/main/kotlin/ai/annadata/mqttquic/mqtt/MQTTProtocol.kt +33 -2
- package/android/src/main/kotlin/ai/annadata/mqttquic/quic/NGTCP2Client.kt +25 -15
- package/android/src/main/kotlin/ai/annadata/mqttquic/quic/QuicClientStub.kt +1 -1
- package/android/src/main/kotlin/ai/annadata/mqttquic/quic/QuicTypes.kt +1 -1
- package/android/src/main/kotlin/ai/annadata/mqttquic/transport/QUICStreamAdapter.kt +80 -5
- package/android/src/main/kotlin/ai/annadata/mqttquic/transport/StreamTransport.kt +4 -0
- package/docs/diff-node_modules-vs-standalone-android-src.patch +1031 -0
- package/ios/build-wolfssl.sh +8 -3
- package/ios/libs/libnghttp3.a +0 -0
- package/ios/libs/libngtcp2.a +0 -0
- package/ios/libs/libngtcp2_crypto_wolfssl.a +0 -0
- package/ios/libs/libwolfssl.a +0 -0
- package/ios/libs-simulator/libnghttp3.a +0 -0
- package/ios/libs-simulator/libngtcp2.a +0 -0
- package/ios/libs-simulator/libngtcp2_crypto_wolfssl.a +0 -0
- package/ios/libs-simulator/libwolfssl.a +0 -0
- package/ios/libs-simulator-x86_64/libnghttp3.a +0 -0
- package/ios/libs-simulator-x86_64/libngtcp2.a +0 -0
- package/ios/libs-simulator-x86_64/libngtcp2_crypto_wolfssl.a +0 -0
- package/ios/libs-simulator-x86_64/libwolfssl.a +0 -0
- package/package.json +1 -1
- package/ios/libs/MqttQuicLibs.xcframework/Info.plist +0 -44
- package/ios/libs/MqttQuicLibs.xcframework/ios-arm64/libmqttquic_native_device.a +0 -0
- package/ios/libs/MqttQuicLibs.xcframework/ios-arm64_x86_64-simulator/libmqttquic_native_simulator.a +0 -0
package/android/build-wolfssl.sh
CHANGED
|
@@ -47,9 +47,15 @@ fi
|
|
|
47
47
|
if [ ! -d "$WOLFSSL_SOURCE_DIR" ] && [ -d "$PROJECT_DIR/../wolfssl-5.8.4-stable" ]; then
|
|
48
48
|
WOLFSSL_SOURCE_DIR="$PROJECT_DIR/../wolfssl-5.8.4-stable"
|
|
49
49
|
fi
|
|
50
|
+
# Clone WolfSSL if missing
|
|
50
51
|
if [ ! -d "$WOLFSSL_SOURCE_DIR" ]; then
|
|
51
|
-
echo "
|
|
52
|
-
|
|
52
|
+
echo "WolfSSL source not found. Cloning into $DEPS_DIR/wolfssl ..."
|
|
53
|
+
mkdir -p "$DEPS_DIR"
|
|
54
|
+
git clone --depth 1 -b "${WOLFSSL_TAG:-v5.8.4-stable}" "${WOLFSSL_REPO_URL:-https://github.com/wolfSSL/wolfssl.git}" "$DEPS_DIR/wolfssl" || {
|
|
55
|
+
echo "Error: Failed to clone WolfSSL"
|
|
56
|
+
exit 1
|
|
57
|
+
}
|
|
58
|
+
WOLFSSL_SOURCE_DIR="$DEPS_DIR/wolfssl"
|
|
53
59
|
fi
|
|
54
60
|
|
|
55
61
|
# Map ABI to toolchain
|
|
Binary file
|
|
Binary file
|
|
@@ -21,10 +21,10 @@
|
|
|
21
21
|
# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
|
|
22
22
|
# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
|
|
23
23
|
# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
|
24
|
-
prefix=/Users/annadata/
|
|
25
|
-
exec_prefix=/Users/annadata/
|
|
26
|
-
libdir=/Users/annadata/
|
|
27
|
-
includedir=/Users/annadata/
|
|
24
|
+
prefix=/Users/annadata/Ionic/capacitor-mqtt-quic/android/install/nghttp3-android/arm64-v8a
|
|
25
|
+
exec_prefix=/Users/annadata/Ionic/capacitor-mqtt-quic/android/install/nghttp3-android/arm64-v8a
|
|
26
|
+
libdir=/Users/annadata/Ionic/capacitor-mqtt-quic/android/install/nghttp3-android/arm64-v8a/lib
|
|
27
|
+
includedir=/Users/annadata/Ionic/capacitor-mqtt-quic/android/install/nghttp3-android/arm64-v8a/include
|
|
28
28
|
|
|
29
29
|
Name: libnghttp3
|
|
30
30
|
Description: nghttp3 library
|
|
Binary file
|
|
Binary file
|
|
@@ -21,10 +21,10 @@
|
|
|
21
21
|
# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
|
|
22
22
|
# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
|
|
23
23
|
# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
|
24
|
-
prefix=/Users/annadata/
|
|
25
|
-
exec_prefix=/Users/annadata/
|
|
26
|
-
libdir=/Users/annadata/
|
|
27
|
-
includedir=/Users/annadata/
|
|
24
|
+
prefix=/Users/annadata/Ionic/capacitor-mqtt-quic/android/install/nghttp3-android/armeabi-v7a
|
|
25
|
+
exec_prefix=/Users/annadata/Ionic/capacitor-mqtt-quic/android/install/nghttp3-android/armeabi-v7a
|
|
26
|
+
libdir=/Users/annadata/Ionic/capacitor-mqtt-quic/android/install/nghttp3-android/armeabi-v7a/lib
|
|
27
|
+
includedir=/Users/annadata/Ionic/capacitor-mqtt-quic/android/install/nghttp3-android/armeabi-v7a/include
|
|
28
28
|
|
|
29
29
|
Name: libnghttp3
|
|
30
30
|
Description: nghttp3 library
|
|
Binary file
|
|
Binary file
|
|
@@ -21,10 +21,10 @@
|
|
|
21
21
|
# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
|
|
22
22
|
# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
|
|
23
23
|
# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
|
24
|
-
prefix=/Users/annadata/
|
|
25
|
-
exec_prefix=/Users/annadata/
|
|
26
|
-
libdir=/Users/annadata/
|
|
27
|
-
includedir=/Users/annadata/
|
|
24
|
+
prefix=/Users/annadata/Ionic/capacitor-mqtt-quic/android/install/nghttp3-android/x86_64
|
|
25
|
+
exec_prefix=/Users/annadata/Ionic/capacitor-mqtt-quic/android/install/nghttp3-android/x86_64
|
|
26
|
+
libdir=/Users/annadata/Ionic/capacitor-mqtt-quic/android/install/nghttp3-android/x86_64/lib
|
|
27
|
+
includedir=/Users/annadata/Ionic/capacitor-mqtt-quic/android/install/nghttp3-android/x86_64/include
|
|
28
28
|
|
|
29
29
|
Name: libnghttp3
|
|
30
30
|
Description: nghttp3 library
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
@@ -20,10 +20,10 @@
|
|
|
20
20
|
# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
|
|
21
21
|
# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
|
|
22
22
|
# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
|
23
|
-
prefix=/Users/annadata/
|
|
24
|
-
exec_prefix=/Users/annadata/
|
|
25
|
-
libdir=/Users/annadata/
|
|
26
|
-
includedir=/Users/annadata/
|
|
23
|
+
prefix=/Users/annadata/Ionic/capacitor-mqtt-quic/android/install/ngtcp2-android/arm64-v8a
|
|
24
|
+
exec_prefix=/Users/annadata/Ionic/capacitor-mqtt-quic/android/install/ngtcp2-android/arm64-v8a
|
|
25
|
+
libdir=/Users/annadata/Ionic/capacitor-mqtt-quic/android/install/ngtcp2-android/arm64-v8a/lib
|
|
26
|
+
includedir=/Users/annadata/Ionic/capacitor-mqtt-quic/android/install/ngtcp2-android/arm64-v8a/include
|
|
27
27
|
|
|
28
28
|
Name: libngtcp2
|
|
29
29
|
Description: ngtcp2 library
|
|
@@ -20,10 +20,10 @@
|
|
|
20
20
|
# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
|
|
21
21
|
# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
|
|
22
22
|
# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
|
23
|
-
prefix=/Users/annadata/
|
|
24
|
-
exec_prefix=/Users/annadata/
|
|
25
|
-
libdir=/Users/annadata/
|
|
26
|
-
includedir=/Users/annadata/
|
|
23
|
+
prefix=/Users/annadata/Ionic/capacitor-mqtt-quic/android/install/ngtcp2-android/arm64-v8a
|
|
24
|
+
exec_prefix=/Users/annadata/Ionic/capacitor-mqtt-quic/android/install/ngtcp2-android/arm64-v8a
|
|
25
|
+
libdir=/Users/annadata/Ionic/capacitor-mqtt-quic/android/install/ngtcp2-android/arm64-v8a/lib
|
|
26
|
+
includedir=/Users/annadata/Ionic/capacitor-mqtt-quic/android/install/ngtcp2-android/arm64-v8a/include
|
|
27
27
|
|
|
28
28
|
Name: libngtcp2_crypto_wolfssl
|
|
29
29
|
Description: ngtcp2 wolfSSL crypto library
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
@@ -20,10 +20,10 @@
|
|
|
20
20
|
# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
|
|
21
21
|
# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
|
|
22
22
|
# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
|
23
|
-
prefix=/Users/annadata/
|
|
24
|
-
exec_prefix=/Users/annadata/
|
|
25
|
-
libdir=/Users/annadata/
|
|
26
|
-
includedir=/Users/annadata/
|
|
23
|
+
prefix=/Users/annadata/Ionic/capacitor-mqtt-quic/android/install/ngtcp2-android/armeabi-v7a
|
|
24
|
+
exec_prefix=/Users/annadata/Ionic/capacitor-mqtt-quic/android/install/ngtcp2-android/armeabi-v7a
|
|
25
|
+
libdir=/Users/annadata/Ionic/capacitor-mqtt-quic/android/install/ngtcp2-android/armeabi-v7a/lib
|
|
26
|
+
includedir=/Users/annadata/Ionic/capacitor-mqtt-quic/android/install/ngtcp2-android/armeabi-v7a/include
|
|
27
27
|
|
|
28
28
|
Name: libngtcp2
|
|
29
29
|
Description: ngtcp2 library
|
package/android/install/ngtcp2-android/armeabi-v7a/lib/pkgconfig/libngtcp2_crypto_wolfssl.pc
CHANGED
|
@@ -20,10 +20,10 @@
|
|
|
20
20
|
# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
|
|
21
21
|
# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
|
|
22
22
|
# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
|
23
|
-
prefix=/Users/annadata/
|
|
24
|
-
exec_prefix=/Users/annadata/
|
|
25
|
-
libdir=/Users/annadata/
|
|
26
|
-
includedir=/Users/annadata/
|
|
23
|
+
prefix=/Users/annadata/Ionic/capacitor-mqtt-quic/android/install/ngtcp2-android/armeabi-v7a
|
|
24
|
+
exec_prefix=/Users/annadata/Ionic/capacitor-mqtt-quic/android/install/ngtcp2-android/armeabi-v7a
|
|
25
|
+
libdir=/Users/annadata/Ionic/capacitor-mqtt-quic/android/install/ngtcp2-android/armeabi-v7a/lib
|
|
26
|
+
includedir=/Users/annadata/Ionic/capacitor-mqtt-quic/android/install/ngtcp2-android/armeabi-v7a/include
|
|
27
27
|
|
|
28
28
|
Name: libngtcp2_crypto_wolfssl
|
|
29
29
|
Description: ngtcp2 wolfSSL crypto library
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
@@ -20,10 +20,10 @@
|
|
|
20
20
|
# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
|
|
21
21
|
# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
|
|
22
22
|
# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
|
23
|
-
prefix=/Users/annadata/
|
|
24
|
-
exec_prefix=/Users/annadata/
|
|
25
|
-
libdir=/Users/annadata/
|
|
26
|
-
includedir=/Users/annadata/
|
|
23
|
+
prefix=/Users/annadata/Ionic/capacitor-mqtt-quic/android/install/ngtcp2-android/x86_64
|
|
24
|
+
exec_prefix=/Users/annadata/Ionic/capacitor-mqtt-quic/android/install/ngtcp2-android/x86_64
|
|
25
|
+
libdir=/Users/annadata/Ionic/capacitor-mqtt-quic/android/install/ngtcp2-android/x86_64/lib
|
|
26
|
+
includedir=/Users/annadata/Ionic/capacitor-mqtt-quic/android/install/ngtcp2-android/x86_64/include
|
|
27
27
|
|
|
28
28
|
Name: libngtcp2
|
|
29
29
|
Description: ngtcp2 library
|
|
@@ -20,10 +20,10 @@
|
|
|
20
20
|
# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
|
|
21
21
|
# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
|
|
22
22
|
# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
|
23
|
-
prefix=/Users/annadata/
|
|
24
|
-
exec_prefix=/Users/annadata/
|
|
25
|
-
libdir=/Users/annadata/
|
|
26
|
-
includedir=/Users/annadata/
|
|
23
|
+
prefix=/Users/annadata/Ionic/capacitor-mqtt-quic/android/install/ngtcp2-android/x86_64
|
|
24
|
+
exec_prefix=/Users/annadata/Ionic/capacitor-mqtt-quic/android/install/ngtcp2-android/x86_64
|
|
25
|
+
libdir=/Users/annadata/Ionic/capacitor-mqtt-quic/android/install/ngtcp2-android/x86_64/lib
|
|
26
|
+
includedir=/Users/annadata/Ionic/capacitor-mqtt-quic/android/install/ngtcp2-android/x86_64/include
|
|
27
27
|
|
|
28
28
|
Name: libngtcp2_crypto_wolfssl
|
|
29
29
|
Description: ngtcp2 wolfSSL crypto library
|
|
@@ -4,7 +4,7 @@ package="wolfssl"
|
|
|
4
4
|
version="5.8.4"
|
|
5
5
|
libs="-lwolfssl"
|
|
6
6
|
|
|
7
|
-
prefix="/Users/annadata/
|
|
7
|
+
prefix="/Users/annadata/Ionic/capacitor-mqtt-quic/android/install/wolfssl-android/arm64-v8a"
|
|
8
8
|
exec_prefix="${prefix}"
|
|
9
9
|
bindir="${exec_prefix}/bin"
|
|
10
10
|
sbindir="${exec_prefix}/sbin"
|
|
Binary file
|
|
@@ -38,4 +38,4 @@ dlopen=''
|
|
|
38
38
|
dlpreopen=''
|
|
39
39
|
|
|
40
40
|
# Directory that this library needs to be installed in:
|
|
41
|
-
libdir='/Users/annadata/
|
|
41
|
+
libdir='/Users/annadata/Ionic/capacitor-mqtt-quic/android/install/wolfssl-android/arm64-v8a/lib'
|
|
@@ -4,7 +4,7 @@ package="wolfssl"
|
|
|
4
4
|
version="5.8.4"
|
|
5
5
|
libs="-lwolfssl"
|
|
6
6
|
|
|
7
|
-
prefix="/Users/annadata/
|
|
7
|
+
prefix="/Users/annadata/Ionic/capacitor-mqtt-quic/android/install/wolfssl-android/armeabi-v7a"
|
|
8
8
|
exec_prefix="${prefix}"
|
|
9
9
|
bindir="${exec_prefix}/bin"
|
|
10
10
|
sbindir="${exec_prefix}/sbin"
|
|
Binary file
|
|
@@ -38,4 +38,4 @@ dlopen=''
|
|
|
38
38
|
dlpreopen=''
|
|
39
39
|
|
|
40
40
|
# Directory that this library needs to be installed in:
|
|
41
|
-
libdir='/Users/annadata/
|
|
41
|
+
libdir='/Users/annadata/Ionic/capacitor-mqtt-quic/android/install/wolfssl-android/armeabi-v7a/lib'
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
prefix=/Users/annadata/
|
|
1
|
+
prefix=/Users/annadata/Ionic/capacitor-mqtt-quic/android/install/wolfssl-android/armeabi-v7a
|
|
2
2
|
exec_prefix=${prefix}
|
|
3
3
|
libdir=${exec_prefix}/lib
|
|
4
4
|
includedir=${prefix}/include
|
|
@@ -4,7 +4,7 @@ package="wolfssl"
|
|
|
4
4
|
version="5.8.4"
|
|
5
5
|
libs="-lwolfssl"
|
|
6
6
|
|
|
7
|
-
prefix="/Users/annadata/
|
|
7
|
+
prefix="/Users/annadata/Ionic/capacitor-mqtt-quic/android/install/wolfssl-android/x86_64"
|
|
8
8
|
exec_prefix="${prefix}"
|
|
9
9
|
bindir="${exec_prefix}/bin"
|
|
10
10
|
sbindir="${exec_prefix}/sbin"
|
|
Binary file
|
|
@@ -38,4 +38,4 @@ dlopen=''
|
|
|
38
38
|
dlpreopen=''
|
|
39
39
|
|
|
40
40
|
# Directory that this library needs to be installed in:
|
|
41
|
-
libdir='/Users/annadata/
|
|
41
|
+
libdir='/Users/annadata/Ionic/capacitor-mqtt-quic/android/install/wolfssl-android/x86_64/lib'
|
|
@@ -24,6 +24,7 @@
|
|
|
24
24
|
#include <algorithm>
|
|
25
25
|
#include <atomic>
|
|
26
26
|
#include <chrono>
|
|
27
|
+
#include <cinttypes>
|
|
27
28
|
#include <cstdarg>
|
|
28
29
|
#include <cstdlib>
|
|
29
30
|
#include <cstdio>
|
|
@@ -73,7 +74,11 @@ struct OutgoingChunk {
|
|
|
73
74
|
class QuicClient {
|
|
74
75
|
public:
|
|
75
76
|
QuicClient(std::string host, uint16_t port)
|
|
76
|
-
:
|
|
77
|
+
: QuicClient(std::move(host), "", port) {}
|
|
78
|
+
|
|
79
|
+
QuicClient(std::string host_for_tls, std::string connect_addr, uint16_t port)
|
|
80
|
+
: host_(std::move(host_for_tls)),
|
|
81
|
+
connect_addr_(connect_addr.empty() ? host_ : std::move(connect_addr)),
|
|
77
82
|
port_(port),
|
|
78
83
|
fd_(-1),
|
|
79
84
|
ssl_ctx_(nullptr),
|
|
@@ -181,6 +186,9 @@ class QuicClient {
|
|
|
181
186
|
buffer[i] = state.recv_buf.front();
|
|
182
187
|
state.recv_buf.pop_front();
|
|
183
188
|
}
|
|
189
|
+
if (n > 0) {
|
|
190
|
+
LOGI("read_stream stream_id=%" PRId64 " returning %zu bytes", (int64_t)stream_id, n);
|
|
191
|
+
}
|
|
184
192
|
return (ssize_t)n;
|
|
185
193
|
}
|
|
186
194
|
|
|
@@ -223,6 +231,8 @@ class QuicClient {
|
|
|
223
231
|
std::lock_guard<std::mutex> lock(stream_mutex_);
|
|
224
232
|
StreamState &state = streams_[stream_id];
|
|
225
233
|
state.recv_buf.insert(state.recv_buf.end(), data, data + datalen);
|
|
234
|
+
LOGI("recv stream data stream_id=%" PRId64 " len=%zu recv_buf_total=%zu",
|
|
235
|
+
(int64_t)stream_id, datalen, state.recv_buf.size());
|
|
226
236
|
if (flags & NGTCP2_STREAM_DATA_FLAG_FIN) {
|
|
227
237
|
state.fin_received = true;
|
|
228
238
|
}
|
|
@@ -254,7 +264,8 @@ class QuicClient {
|
|
|
254
264
|
|
|
255
265
|
char port_str[16];
|
|
256
266
|
snprintf(port_str, sizeof(port_str), "%u", port_);
|
|
257
|
-
|
|
267
|
+
const char *resolve_host = connect_addr_.empty() ? host_.c_str() : connect_addr_.c_str();
|
|
268
|
+
int rv = getaddrinfo(resolve_host, port_str, &hints, &res);
|
|
258
269
|
if (rv != 0) {
|
|
259
270
|
setError(gai_strerror(rv));
|
|
260
271
|
return -1;
|
|
@@ -269,6 +280,13 @@ class QuicClient {
|
|
|
269
280
|
if (::connect(fd, rp->ai_addr, rp->ai_addrlen) == 0) {
|
|
270
281
|
memcpy(&remote_addr_, rp->ai_addr, rp->ai_addrlen);
|
|
271
282
|
remote_addrlen_ = (socklen_t)rp->ai_addrlen;
|
|
283
|
+
char buf[INET6_ADDRSTRLEN];
|
|
284
|
+
const void *src = (rp->ai_family == AF_INET)
|
|
285
|
+
? (void *)&((struct sockaddr_in *)rp->ai_addr)->sin_addr
|
|
286
|
+
: (void *)&((struct sockaddr_in6 *)rp->ai_addr)->sin6_addr;
|
|
287
|
+
if (inet_ntop(rp->ai_family, src, buf, sizeof(buf))) {
|
|
288
|
+
resolved_address_ = buf;
|
|
289
|
+
}
|
|
272
290
|
break;
|
|
273
291
|
}
|
|
274
292
|
::close(fd);
|
|
@@ -651,30 +669,44 @@ class QuicClient {
|
|
|
651
669
|
}
|
|
652
670
|
|
|
653
671
|
void cleanup() {
|
|
654
|
-
|
|
655
|
-
|
|
672
|
+
ngtcp2_conn *conn_to_del = nullptr;
|
|
673
|
+
void *ssl_to_free = nullptr;
|
|
674
|
+
void *ssl_ctx_to_free = nullptr;
|
|
675
|
+
int fd_to_close = -1;
|
|
676
|
+
int wake0 = -1, wake1 = -1;
|
|
677
|
+
{
|
|
678
|
+
std::lock_guard<std::mutex> lock(cleanup_mutex_);
|
|
679
|
+
conn_to_del = conn_;
|
|
656
680
|
conn_ = nullptr;
|
|
657
|
-
|
|
658
|
-
if (ssl_) {
|
|
659
|
-
wolfSSL_free(ssl_);
|
|
681
|
+
ssl_to_free = ssl_;
|
|
660
682
|
ssl_ = nullptr;
|
|
661
|
-
|
|
662
|
-
if (ssl_ctx_) {
|
|
663
|
-
wolfSSL_CTX_free(ssl_ctx_);
|
|
683
|
+
ssl_ctx_to_free = ssl_ctx_;
|
|
664
684
|
ssl_ctx_ = nullptr;
|
|
665
|
-
|
|
666
|
-
if (fd_ != -1) {
|
|
667
|
-
::close(fd_);
|
|
685
|
+
fd_to_close = fd_;
|
|
668
686
|
fd_ = -1;
|
|
669
|
-
|
|
670
|
-
|
|
671
|
-
::close(wakeup_fds_[0]);
|
|
687
|
+
wake0 = wakeup_fds_[0];
|
|
688
|
+
wake1 = wakeup_fds_[1];
|
|
672
689
|
wakeup_fds_[0] = -1;
|
|
673
|
-
}
|
|
674
|
-
if (wakeup_fds_[1] != -1) {
|
|
675
|
-
::close(wakeup_fds_[1]);
|
|
676
690
|
wakeup_fds_[1] = -1;
|
|
677
691
|
}
|
|
692
|
+
if (conn_to_del) {
|
|
693
|
+
ngtcp2_conn_del(conn_to_del);
|
|
694
|
+
}
|
|
695
|
+
if (ssl_to_free) {
|
|
696
|
+
wolfSSL_free(static_cast<WOLFSSL *>(ssl_to_free));
|
|
697
|
+
}
|
|
698
|
+
if (ssl_ctx_to_free) {
|
|
699
|
+
wolfSSL_CTX_free(static_cast<WOLFSSL_CTX *>(ssl_ctx_to_free));
|
|
700
|
+
}
|
|
701
|
+
if (fd_to_close != -1) {
|
|
702
|
+
::close(fd_to_close);
|
|
703
|
+
}
|
|
704
|
+
if (wake0 != -1) {
|
|
705
|
+
::close(wake0);
|
|
706
|
+
}
|
|
707
|
+
if (wake1 != -1) {
|
|
708
|
+
::close(wake1);
|
|
709
|
+
}
|
|
678
710
|
}
|
|
679
711
|
|
|
680
712
|
void clearError() {
|
|
@@ -766,9 +798,14 @@ class QuicClient {
|
|
|
766
798
|
return client->on_handshake_completed();
|
|
767
799
|
}
|
|
768
800
|
|
|
801
|
+
public:
|
|
802
|
+
const std::string &resolved_address() const { return resolved_address_; }
|
|
803
|
+
|
|
769
804
|
private:
|
|
770
805
|
std::string host_;
|
|
806
|
+
std::string connect_addr_;
|
|
771
807
|
uint16_t port_;
|
|
808
|
+
std::string resolved_address_;
|
|
772
809
|
|
|
773
810
|
int fd_;
|
|
774
811
|
struct sockaddr_storage remote_addr_;
|
|
@@ -800,6 +837,8 @@ class QuicClient {
|
|
|
800
837
|
|
|
801
838
|
mutable std::mutex err_mutex_;
|
|
802
839
|
std::string last_error_str_;
|
|
840
|
+
|
|
841
|
+
std::mutex cleanup_mutex_;
|
|
803
842
|
};
|
|
804
843
|
|
|
805
844
|
static std::map<jlong, std::unique_ptr<QuicClient>> connections;
|
|
@@ -827,6 +866,27 @@ Java_ai_annadata_mqttquic_quic_NGTCP2Client_nativeCreateConnection(
|
|
|
827
866
|
return handle;
|
|
828
867
|
}
|
|
829
868
|
|
|
869
|
+
JNIEXPORT jlong JNICALL
|
|
870
|
+
Java_ai_annadata_mqttquic_quic_NGTCP2Client_nativeCreateConnectionWithAddress(
|
|
871
|
+
JNIEnv *env, jobject thiz, jstring hostnameForTls, jstring connectAddress, jint port) {
|
|
872
|
+
const char *tls_str = env->GetStringUTFChars(hostnameForTls, nullptr);
|
|
873
|
+
const char *addr_str = env->GetStringUTFChars(connectAddress, nullptr);
|
|
874
|
+
if (!tls_str || !addr_str) {
|
|
875
|
+
if (tls_str) env->ReleaseStringUTFChars(hostnameForTls, tls_str);
|
|
876
|
+
return 0;
|
|
877
|
+
}
|
|
878
|
+
std::string host_for_tls(tls_str);
|
|
879
|
+
std::string connect_addr(addr_str);
|
|
880
|
+
env->ReleaseStringUTFChars(hostnameForTls, tls_str);
|
|
881
|
+
env->ReleaseStringUTFChars(connectAddress, addr_str);
|
|
882
|
+
|
|
883
|
+
auto client = std::make_unique<QuicClient>(host_for_tls, connect_addr, (uint16_t)port);
|
|
884
|
+
std::lock_guard<std::mutex> lock(connections_mutex);
|
|
885
|
+
jlong handle = next_handle++;
|
|
886
|
+
connections[handle] = std::move(client);
|
|
887
|
+
return handle;
|
|
888
|
+
}
|
|
889
|
+
|
|
830
890
|
JNIEXPORT jint JNICALL
|
|
831
891
|
Java_ai_annadata_mqttquic_quic_NGTCP2Client_nativeConnect(
|
|
832
892
|
JNIEnv *env, jobject thiz, jlong connHandle) {
|
|
@@ -931,6 +991,21 @@ Java_ai_annadata_mqttquic_quic_NGTCP2Client_nativeGetLastError(
|
|
|
931
991
|
return env->NewStringUTF(it->second->last_error());
|
|
932
992
|
}
|
|
933
993
|
|
|
994
|
+
JNIEXPORT jstring JNICALL
|
|
995
|
+
Java_ai_annadata_mqttquic_quic_NGTCP2Client_nativeGetLastResolvedAddress(
|
|
996
|
+
JNIEnv *env, jobject thiz, jlong connHandle) {
|
|
997
|
+
std::lock_guard<std::mutex> lock(connections_mutex);
|
|
998
|
+
auto it = connections.find(connHandle);
|
|
999
|
+
if (it == connections.end()) {
|
|
1000
|
+
return nullptr;
|
|
1001
|
+
}
|
|
1002
|
+
const std::string &addr = it->second->resolved_address();
|
|
1003
|
+
if (addr.empty()) {
|
|
1004
|
+
return nullptr;
|
|
1005
|
+
}
|
|
1006
|
+
return env->NewStringUTF(addr.c_str());
|
|
1007
|
+
}
|
|
1008
|
+
|
|
934
1009
|
// Debug-build alias: Kotlin/AGP can mangle the method name to include the module suffix.
|
|
935
1010
|
JNIEXPORT jstring JNICALL
|
|
936
1011
|
Java_ai_annadata_mqttquic_quic_NGTCP2Client_nativeGetLastError_00024annadata_1capacitor_1mqtt_1quic_1debug__J(
|
|
@@ -13,10 +13,13 @@ import android.system.Os
|
|
|
13
13
|
import android.util.Base64
|
|
14
14
|
import kotlinx.coroutines.CoroutineScope
|
|
15
15
|
import kotlinx.coroutines.Dispatchers
|
|
16
|
+
import kotlinx.coroutines.delay
|
|
16
17
|
import kotlinx.coroutines.launch
|
|
18
|
+
import kotlinx.coroutines.withContext
|
|
17
19
|
import java.nio.charset.StandardCharsets
|
|
18
20
|
import java.io.File
|
|
19
21
|
import java.io.IOException
|
|
22
|
+
import java.net.InetAddress
|
|
20
23
|
|
|
21
24
|
/**
|
|
22
25
|
* Capacitor plugin bridge. Phase 3: connect/publish/subscribe call into MQTTClient.
|
|
@@ -27,6 +30,29 @@ class MqttQuicPlugin : Plugin() {
|
|
|
27
30
|
private var client = MQTTClient(MQTTClient.ProtocolVersion.AUTO)
|
|
28
31
|
private val scope = CoroutineScope(Dispatchers.Main)
|
|
29
32
|
|
|
33
|
+
/** Last resolved IP per host (used when DNS fails on reconnect). */
|
|
34
|
+
@Volatile
|
|
35
|
+
private var lastResolvedHost: String? = null
|
|
36
|
+
@Volatile
|
|
37
|
+
private var lastResolvedIp: String? = null
|
|
38
|
+
|
|
39
|
+
/** Resolve hostname to IP for socket connect (avoids "No address" on reconnect). Returns null if resolution fails. */
|
|
40
|
+
private fun resolveHostToIp(host: String): String? {
|
|
41
|
+
return try {
|
|
42
|
+
InetAddress.getAllByName(host).firstOrNull()?.hostAddress?.also { ip ->
|
|
43
|
+
lastResolvedHost = host
|
|
44
|
+
lastResolvedIp = ip
|
|
45
|
+
}
|
|
46
|
+
} catch (e: Exception) {
|
|
47
|
+
null
|
|
48
|
+
}
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
/** Use cached IP for this host if fresh resolve failed (e.g. on reconnect). */
|
|
52
|
+
private fun resolveOrCachedIp(host: String): String? {
|
|
53
|
+
return resolveHostToIp(host) ?: if (host == lastResolvedHost) lastResolvedIp else null
|
|
54
|
+
}
|
|
55
|
+
|
|
30
56
|
private fun bundledCaFilePath(): String? {
|
|
31
57
|
return try {
|
|
32
58
|
val assetName = "mqttquic_ca.pem"
|
|
@@ -100,9 +126,38 @@ class MqttQuicPlugin : Plugin() {
|
|
|
100
126
|
notifyListeners("message", data)
|
|
101
127
|
}
|
|
102
128
|
}
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
129
|
+
// Resolve host to IP on IO so native getaddrinfo gets an IP (avoids "No address associated with hostname" on reconnect)
|
|
130
|
+
val noAddressMsg = "No address associated with hostname"
|
|
131
|
+
var lastException: Exception? = null
|
|
132
|
+
for (attempt in 1..2) {
|
|
133
|
+
try {
|
|
134
|
+
withContext(Dispatchers.IO) {
|
|
135
|
+
val resolvedIp = resolveOrCachedIp(host)
|
|
136
|
+
client.connect(host, port, clientId, username, password, cleanSession ?: true, keepalive ?: 20, sessionExpiryInterval, connectAddress = resolvedIp)
|
|
137
|
+
}
|
|
138
|
+
// Cache resolved IP from native so reconnect can use it when Java DNS fails
|
|
139
|
+
client.getLastResolvedAddress()?.let { ip ->
|
|
140
|
+
lastResolvedHost = host
|
|
141
|
+
lastResolvedIp = ip
|
|
142
|
+
}
|
|
143
|
+
call.resolve(JSObject().put("connected", true))
|
|
144
|
+
notifyListeners("connected", JSObject().put("connected", true))
|
|
145
|
+
return@launch
|
|
146
|
+
} catch (e: Exception) {
|
|
147
|
+
// Cache resolved IP from native even on failure (e.g. CONNACK timeout) so reconnect can use it
|
|
148
|
+
client.getLastResolvedAddress()?.let { ip ->
|
|
149
|
+
lastResolvedHost = host
|
|
150
|
+
lastResolvedIp = ip
|
|
151
|
+
}
|
|
152
|
+
lastException = e
|
|
153
|
+
if (attempt == 1 && e.message?.contains(noAddressMsg, ignoreCase = true) == true) {
|
|
154
|
+
delay(2000L)
|
|
155
|
+
continue
|
|
156
|
+
}
|
|
157
|
+
break
|
|
158
|
+
}
|
|
159
|
+
}
|
|
160
|
+
call.reject(lastException?.message ?: "Connection failed")
|
|
106
161
|
} catch (e: Exception) {
|
|
107
162
|
call.reject(e.message ?: "Connection failed")
|
|
108
163
|
}
|