@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.
Files changed (67) hide show
  1. package/android/build-wolfssl.sh +8 -2
  2. package/android/install/nghttp3-android/arm64-v8a/lib/libnghttp3.a +0 -0
  3. package/android/install/nghttp3-android/arm64-v8a/lib/libnghttp3.so +0 -0
  4. package/android/install/nghttp3-android/arm64-v8a/lib/pkgconfig/libnghttp3.pc +4 -4
  5. package/android/install/nghttp3-android/armeabi-v7a/lib/libnghttp3.a +0 -0
  6. package/android/install/nghttp3-android/armeabi-v7a/lib/libnghttp3.so +0 -0
  7. package/android/install/nghttp3-android/armeabi-v7a/lib/pkgconfig/libnghttp3.pc +4 -4
  8. package/android/install/nghttp3-android/x86_64/lib/libnghttp3.a +0 -0
  9. package/android/install/nghttp3-android/x86_64/lib/libnghttp3.so +0 -0
  10. package/android/install/nghttp3-android/x86_64/lib/pkgconfig/libnghttp3.pc +4 -4
  11. package/android/install/ngtcp2-android/arm64-v8a/lib/libngtcp2.a +0 -0
  12. package/android/install/ngtcp2-android/arm64-v8a/lib/libngtcp2.so +0 -0
  13. package/android/install/ngtcp2-android/arm64-v8a/lib/libngtcp2_crypto_wolfssl.a +0 -0
  14. package/android/install/ngtcp2-android/arm64-v8a/lib/libngtcp2_crypto_wolfssl.so +0 -0
  15. package/android/install/ngtcp2-android/arm64-v8a/lib/pkgconfig/libngtcp2.pc +4 -4
  16. package/android/install/ngtcp2-android/arm64-v8a/lib/pkgconfig/libngtcp2_crypto_wolfssl.pc +4 -4
  17. package/android/install/ngtcp2-android/armeabi-v7a/lib/libngtcp2.a +0 -0
  18. package/android/install/ngtcp2-android/armeabi-v7a/lib/libngtcp2.so +0 -0
  19. package/android/install/ngtcp2-android/armeabi-v7a/lib/libngtcp2_crypto_wolfssl.a +0 -0
  20. package/android/install/ngtcp2-android/armeabi-v7a/lib/libngtcp2_crypto_wolfssl.so +0 -0
  21. package/android/install/ngtcp2-android/armeabi-v7a/lib/pkgconfig/libngtcp2.pc +4 -4
  22. package/android/install/ngtcp2-android/armeabi-v7a/lib/pkgconfig/libngtcp2_crypto_wolfssl.pc +4 -4
  23. package/android/install/ngtcp2-android/x86_64/lib/libngtcp2.a +0 -0
  24. package/android/install/ngtcp2-android/x86_64/lib/libngtcp2.so +0 -0
  25. package/android/install/ngtcp2-android/x86_64/lib/libngtcp2_crypto_wolfssl.a +0 -0
  26. package/android/install/ngtcp2-android/x86_64/lib/libngtcp2_crypto_wolfssl.so +0 -0
  27. package/android/install/ngtcp2-android/x86_64/lib/pkgconfig/libngtcp2.pc +4 -4
  28. package/android/install/ngtcp2-android/x86_64/lib/pkgconfig/libngtcp2_crypto_wolfssl.pc +4 -4
  29. package/android/install/wolfssl-android/arm64-v8a/bin/wolfssl-config +1 -1
  30. package/android/install/wolfssl-android/arm64-v8a/lib/libwolfssl.a +0 -0
  31. package/android/install/wolfssl-android/arm64-v8a/lib/libwolfssl.la +1 -1
  32. package/android/install/wolfssl-android/arm64-v8a/lib/pkgconfig/wolfssl.pc +1 -1
  33. package/android/install/wolfssl-android/armeabi-v7a/bin/wolfssl-config +1 -1
  34. package/android/install/wolfssl-android/armeabi-v7a/lib/libwolfssl.a +0 -0
  35. package/android/install/wolfssl-android/armeabi-v7a/lib/libwolfssl.la +1 -1
  36. package/android/install/wolfssl-android/armeabi-v7a/lib/pkgconfig/wolfssl.pc +1 -1
  37. package/android/install/wolfssl-android/x86_64/bin/wolfssl-config +1 -1
  38. package/android/install/wolfssl-android/x86_64/lib/libwolfssl.a +0 -0
  39. package/android/install/wolfssl-android/x86_64/lib/libwolfssl.la +1 -1
  40. package/android/install/wolfssl-android/x86_64/lib/pkgconfig/wolfssl.pc +1 -1
  41. package/android/src/main/cpp/ngtcp2_jni.cpp +94 -19
  42. package/android/src/main/kotlin/ai/annadata/mqttquic/MqttQuicPlugin.kt +58 -3
  43. package/android/src/main/kotlin/ai/annadata/mqttquic/client/MQTTClient.kt +230 -80
  44. package/android/src/main/kotlin/ai/annadata/mqttquic/mqtt/MQTTProtocol.kt +33 -2
  45. package/android/src/main/kotlin/ai/annadata/mqttquic/quic/NGTCP2Client.kt +25 -15
  46. package/android/src/main/kotlin/ai/annadata/mqttquic/quic/QuicClientStub.kt +1 -1
  47. package/android/src/main/kotlin/ai/annadata/mqttquic/quic/QuicTypes.kt +1 -1
  48. package/android/src/main/kotlin/ai/annadata/mqttquic/transport/QUICStreamAdapter.kt +80 -5
  49. package/android/src/main/kotlin/ai/annadata/mqttquic/transport/StreamTransport.kt +4 -0
  50. package/docs/diff-node_modules-vs-standalone-android-src.patch +1031 -0
  51. package/ios/build-wolfssl.sh +8 -3
  52. package/ios/libs/libnghttp3.a +0 -0
  53. package/ios/libs/libngtcp2.a +0 -0
  54. package/ios/libs/libngtcp2_crypto_wolfssl.a +0 -0
  55. package/ios/libs/libwolfssl.a +0 -0
  56. package/ios/libs-simulator/libnghttp3.a +0 -0
  57. package/ios/libs-simulator/libngtcp2.a +0 -0
  58. package/ios/libs-simulator/libngtcp2_crypto_wolfssl.a +0 -0
  59. package/ios/libs-simulator/libwolfssl.a +0 -0
  60. package/ios/libs-simulator-x86_64/libnghttp3.a +0 -0
  61. package/ios/libs-simulator-x86_64/libngtcp2.a +0 -0
  62. package/ios/libs-simulator-x86_64/libngtcp2_crypto_wolfssl.a +0 -0
  63. package/ios/libs-simulator-x86_64/libwolfssl.a +0 -0
  64. package/package.json +1 -1
  65. package/ios/libs/MqttQuicLibs.xcframework/Info.plist +0 -44
  66. package/ios/libs/MqttQuicLibs.xcframework/ios-arm64/libmqttquic_native_device.a +0 -0
  67. package/ios/libs/MqttQuicLibs.xcframework/ios-arm64_x86_64-simulator/libmqttquic_native_simulator.a +0 -0
@@ -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 "Error: WolfSSL source not found at $WOLFSSL_SOURCE_DIR"
52
- exit 1
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
@@ -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/Project_A/capacitor-mqtt-quic/android/install/nghttp3-android/arm64-v8a
25
- exec_prefix=/Users/annadata/Project_A/capacitor-mqtt-quic/android/install/nghttp3-android/arm64-v8a
26
- libdir=/Users/annadata/Project_A/capacitor-mqtt-quic/android/install/nghttp3-android/arm64-v8a/lib
27
- includedir=/Users/annadata/Project_A/capacitor-mqtt-quic/android/install/nghttp3-android/arm64-v8a/include
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
@@ -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/Project_A/capacitor-mqtt-quic/android/install/nghttp3-android/armeabi-v7a
25
- exec_prefix=/Users/annadata/Project_A/capacitor-mqtt-quic/android/install/nghttp3-android/armeabi-v7a
26
- libdir=/Users/annadata/Project_A/capacitor-mqtt-quic/android/install/nghttp3-android/armeabi-v7a/lib
27
- includedir=/Users/annadata/Project_A/capacitor-mqtt-quic/android/install/nghttp3-android/armeabi-v7a/include
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
@@ -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/Project_A/capacitor-mqtt-quic/android/install/nghttp3-android/x86_64
25
- exec_prefix=/Users/annadata/Project_A/capacitor-mqtt-quic/android/install/nghttp3-android/x86_64
26
- libdir=/Users/annadata/Project_A/capacitor-mqtt-quic/android/install/nghttp3-android/x86_64/lib
27
- includedir=/Users/annadata/Project_A/capacitor-mqtt-quic/android/install/nghttp3-android/x86_64/include
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
@@ -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/Project_A/capacitor-mqtt-quic/android/install/ngtcp2-android/arm64-v8a
24
- exec_prefix=/Users/annadata/Project_A/capacitor-mqtt-quic/android/install/ngtcp2-android/arm64-v8a
25
- libdir=/Users/annadata/Project_A/capacitor-mqtt-quic/android/install/ngtcp2-android/arm64-v8a/lib
26
- includedir=/Users/annadata/Project_A/capacitor-mqtt-quic/android/install/ngtcp2-android/arm64-v8a/include
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/Project_A/capacitor-mqtt-quic/android/install/ngtcp2-android/arm64-v8a
24
- exec_prefix=/Users/annadata/Project_A/capacitor-mqtt-quic/android/install/ngtcp2-android/arm64-v8a
25
- libdir=/Users/annadata/Project_A/capacitor-mqtt-quic/android/install/ngtcp2-android/arm64-v8a/lib
26
- includedir=/Users/annadata/Project_A/capacitor-mqtt-quic/android/install/ngtcp2-android/arm64-v8a/include
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
@@ -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/Project_A/capacitor-mqtt-quic/android/install/ngtcp2-android/armeabi-v7a
24
- exec_prefix=/Users/annadata/Project_A/capacitor-mqtt-quic/android/install/ngtcp2-android/armeabi-v7a
25
- libdir=/Users/annadata/Project_A/capacitor-mqtt-quic/android/install/ngtcp2-android/armeabi-v7a/lib
26
- includedir=/Users/annadata/Project_A/capacitor-mqtt-quic/android/install/ngtcp2-android/armeabi-v7a/include
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
@@ -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/Project_A/capacitor-mqtt-quic/android/install/ngtcp2-android/armeabi-v7a
24
- exec_prefix=/Users/annadata/Project_A/capacitor-mqtt-quic/android/install/ngtcp2-android/armeabi-v7a
25
- libdir=/Users/annadata/Project_A/capacitor-mqtt-quic/android/install/ngtcp2-android/armeabi-v7a/lib
26
- includedir=/Users/annadata/Project_A/capacitor-mqtt-quic/android/install/ngtcp2-android/armeabi-v7a/include
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
@@ -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/Project_A/capacitor-mqtt-quic/android/install/ngtcp2-android/x86_64
24
- exec_prefix=/Users/annadata/Project_A/capacitor-mqtt-quic/android/install/ngtcp2-android/x86_64
25
- libdir=/Users/annadata/Project_A/capacitor-mqtt-quic/android/install/ngtcp2-android/x86_64/lib
26
- includedir=/Users/annadata/Project_A/capacitor-mqtt-quic/android/install/ngtcp2-android/x86_64/include
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/Project_A/capacitor-mqtt-quic/android/install/ngtcp2-android/x86_64
24
- exec_prefix=/Users/annadata/Project_A/capacitor-mqtt-quic/android/install/ngtcp2-android/x86_64
25
- libdir=/Users/annadata/Project_A/capacitor-mqtt-quic/android/install/ngtcp2-android/x86_64/lib
26
- includedir=/Users/annadata/Project_A/capacitor-mqtt-quic/android/install/ngtcp2-android/x86_64/include
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/Project_A/capacitor-mqtt-quic/android/install/wolfssl-android/arm64-v8a"
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"
@@ -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/Project_A/capacitor-mqtt-quic/android/install/wolfssl-android/arm64-v8a/lib'
41
+ libdir='/Users/annadata/Ionic/capacitor-mqtt-quic/android/install/wolfssl-android/arm64-v8a/lib'
@@ -1,4 +1,4 @@
1
- prefix=/Users/annadata/Project_A/capacitor-mqtt-quic/android/install/wolfssl-android/arm64-v8a
1
+ prefix=/Users/annadata/Ionic/capacitor-mqtt-quic/android/install/wolfssl-android/arm64-v8a
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/Project_A/capacitor-mqtt-quic/android/install/wolfssl-android/armeabi-v7a"
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"
@@ -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/Project_A/capacitor-mqtt-quic/android/install/wolfssl-android/armeabi-v7a/lib'
41
+ libdir='/Users/annadata/Ionic/capacitor-mqtt-quic/android/install/wolfssl-android/armeabi-v7a/lib'
@@ -1,4 +1,4 @@
1
- prefix=/Users/annadata/Project_A/capacitor-mqtt-quic/android/install/wolfssl-android/armeabi-v7a
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/Project_A/capacitor-mqtt-quic/android/install/wolfssl-android/x86_64"
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"
@@ -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/Project_A/capacitor-mqtt-quic/android/install/wolfssl-android/x86_64/lib'
41
+ libdir='/Users/annadata/Ionic/capacitor-mqtt-quic/android/install/wolfssl-android/x86_64/lib'
@@ -1,4 +1,4 @@
1
- prefix=/Users/annadata/Project_A/capacitor-mqtt-quic/android/install/wolfssl-android/x86_64
1
+ prefix=/Users/annadata/Ionic/capacitor-mqtt-quic/android/install/wolfssl-android/x86_64
2
2
  exec_prefix=${prefix}
3
3
  libdir=${exec_prefix}/lib
4
4
  includedir=${prefix}/include
@@ -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
- : host_(std::move(host)),
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
- int rv = getaddrinfo(host_.c_str(), port_str, &hints, &res);
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
- if (conn_) {
655
- ngtcp2_conn_del(conn_);
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
- if (wakeup_fds_[0] != -1) {
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
- client.connect(host, port, clientId, username, password, cleanSession ?: true, keepalive ?: 20, sessionExpiryInterval)
104
- call.resolve(JSObject().put("connected", true))
105
- notifyListeners("connected", JSObject().put("connected", true))
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
  }