@annadata/capacitor-mqtt-quic 0.1.0

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 (64) hide show
  1. package/README.md +399 -0
  2. package/android/NGTCP2_BUILD_INSTRUCTIONS.md +319 -0
  3. package/android/build-nghttp3.sh +182 -0
  4. package/android/build-ngtcp2.sh +289 -0
  5. package/android/build-openssl.sh +302 -0
  6. package/android/build.gradle +75 -0
  7. package/android/gradle.properties +3 -0
  8. package/android/proguard-rules.pro +2 -0
  9. package/android/settings.gradle +1 -0
  10. package/android/src/main/AndroidManifest.xml +1 -0
  11. package/android/src/main/assets/mqttquic_ca.pem +5 -0
  12. package/android/src/main/cpp/CMakeLists.txt +157 -0
  13. package/android/src/main/cpp/ngtcp2_jni.cpp +928 -0
  14. package/android/src/main/kotlin/ai/annadata/mqttquic/MqttQuicPlugin.kt +232 -0
  15. package/android/src/main/kotlin/ai/annadata/mqttquic/client/MQTTClient.kt +339 -0
  16. package/android/src/main/kotlin/ai/annadata/mqttquic/mqtt/MQTT5Properties.kt +250 -0
  17. package/android/src/main/kotlin/ai/annadata/mqttquic/mqtt/MQTT5Protocol.kt +281 -0
  18. package/android/src/main/kotlin/ai/annadata/mqttquic/mqtt/MQTT5ReasonCodes.kt +109 -0
  19. package/android/src/main/kotlin/ai/annadata/mqttquic/mqtt/MQTTProtocol.kt +249 -0
  20. package/android/src/main/kotlin/ai/annadata/mqttquic/mqtt/MQTTTypes.kt +47 -0
  21. package/android/src/main/kotlin/ai/annadata/mqttquic/quic/NGTCP2Client.kt +184 -0
  22. package/android/src/main/kotlin/ai/annadata/mqttquic/quic/QuicClientStub.kt +54 -0
  23. package/android/src/main/kotlin/ai/annadata/mqttquic/quic/QuicTypes.kt +21 -0
  24. package/android/src/main/kotlin/ai/annadata/mqttquic/transport/QUICStreamAdapter.kt +37 -0
  25. package/android/src/main/kotlin/ai/annadata/mqttquic/transport/StreamTransport.kt +91 -0
  26. package/android/src/test/kotlin/ai/annadata/mqttquic/mqtt/MQTTProtocolTest.kt +92 -0
  27. package/dist/esm/definitions.d.ts +66 -0
  28. package/dist/esm/definitions.d.ts.map +1 -0
  29. package/dist/esm/definitions.js +2 -0
  30. package/dist/esm/definitions.js.map +1 -0
  31. package/dist/esm/index.d.ts +5 -0
  32. package/dist/esm/index.d.ts.map +1 -0
  33. package/dist/esm/index.js +7 -0
  34. package/dist/esm/index.js.map +1 -0
  35. package/dist/esm/web.d.ts +28 -0
  36. package/dist/esm/web.d.ts.map +1 -0
  37. package/dist/esm/web.js +183 -0
  38. package/dist/esm/web.js.map +1 -0
  39. package/dist/plugin.cjs.js +217 -0
  40. package/dist/plugin.cjs.js.map +1 -0
  41. package/dist/plugin.js +215 -0
  42. package/dist/plugin.js.map +1 -0
  43. package/ios/MqttQuicPlugin.podspec +34 -0
  44. package/ios/NGTCP2_BUILD_INSTRUCTIONS.md +302 -0
  45. package/ios/Sources/MqttQuicPlugin/Client/MQTTClient.swift +343 -0
  46. package/ios/Sources/MqttQuicPlugin/MQTT/MQTT5Properties.swift +280 -0
  47. package/ios/Sources/MqttQuicPlugin/MQTT/MQTT5Protocol.swift +333 -0
  48. package/ios/Sources/MqttQuicPlugin/MQTT/MQTT5ReasonCodes.swift +113 -0
  49. package/ios/Sources/MqttQuicPlugin/MQTT/MQTTProtocol.swift +322 -0
  50. package/ios/Sources/MqttQuicPlugin/MQTT/MQTTTypes.swift +54 -0
  51. package/ios/Sources/MqttQuicPlugin/MqttQuicPlugin.swift +229 -0
  52. package/ios/Sources/MqttQuicPlugin/QUIC/NGTCP2Bridge.h +29 -0
  53. package/ios/Sources/MqttQuicPlugin/QUIC/NGTCP2Bridge.mm +865 -0
  54. package/ios/Sources/MqttQuicPlugin/QUIC/NGTCP2Client.swift +262 -0
  55. package/ios/Sources/MqttQuicPlugin/QUIC/QuicClientStub.swift +66 -0
  56. package/ios/Sources/MqttQuicPlugin/QUIC/QuicTypes.swift +23 -0
  57. package/ios/Sources/MqttQuicPlugin/Resources/mqttquic_ca.pem +5 -0
  58. package/ios/Sources/MqttQuicPlugin/Transport/QUICStreamAdapter.swift +50 -0
  59. package/ios/Sources/MqttQuicPlugin/Transport/StreamTransport.swift +105 -0
  60. package/ios/Tests/MQTTProtocolTests.swift +82 -0
  61. package/ios/build-nghttp3.sh +173 -0
  62. package/ios/build-ngtcp2.sh +278 -0
  63. package/ios/build-openssl.sh +405 -0
  64. package/package.json +63 -0
@@ -0,0 +1,302 @@
1
+ #!/bin/bash
2
+ #
3
+ # Build script for OpenSSL on Android
4
+ #
5
+ # This script builds OpenSSL 3.0+ as a static library for Android.
6
+ # It requires:
7
+ # - Android NDK r25+
8
+ # - Android SDK 21+ (API level 21 = Android 5.0)
9
+ #
10
+ # Usage:
11
+ # ./build-openssl.sh [--ndk-path PATH] [--abi ABI] [--platform PLATFORM] [--version VERSION] [--quictls] [--quictls-branch BRANCH]
12
+ #
13
+ # Example:
14
+ # ./build-openssl.sh --ndk-path ~/Android/Sdk/ndk/25.2.9519653 --abi arm64-v8a --platform android-21 --quictls
15
+ #
16
+
17
+ set -e
18
+
19
+ # Default values
20
+ SCRIPT_DIR="$(cd "$(dirname "$0")" && pwd)"
21
+ if [ -n "$PROJECT_DIR" ]; then
22
+ REF_CODE_DIR="$(cd "$PROJECT_DIR/ref-code" && pwd)"
23
+ else
24
+ REF_CODE_DIR="$(cd "$SCRIPT_DIR/../.." && pwd)"
25
+ fi
26
+ DEFAULT_OPENSSL_SOURCE_DIR=""
27
+ if [ -n "$PROJECT_DIR" ] && [ -d "$PROJECT_DIR/ref-code/openssl" ]; then
28
+ DEFAULT_OPENSSL_SOURCE_DIR="$(cd "$PROJECT_DIR/ref-code/openssl" && pwd)"
29
+ elif [ -n "$PROJECT_DIR" ] && [ -d "$PROJECT_DIR/ref-code.openssl" ]; then
30
+ DEFAULT_OPENSSL_SOURCE_DIR="$(cd "$PROJECT_DIR/ref-code.openssl" && pwd)"
31
+ elif [ -d "$SCRIPT_DIR/../ref-code/openssl" ]; then
32
+ DEFAULT_OPENSSL_SOURCE_DIR="$(cd "$SCRIPT_DIR/../ref-code/openssl" && pwd)"
33
+ elif [ -d "$SCRIPT_DIR/../ref-code.openssl" ]; then
34
+ DEFAULT_OPENSSL_SOURCE_DIR="$(cd "$SCRIPT_DIR/../ref-code.openssl" && pwd)"
35
+ else
36
+ DEFAULT_OPENSSL_SOURCE_DIR="$REF_CODE_DIR/openssl"
37
+ fi
38
+ OPENSSL_VERSION="${OPENSSL_VERSION:-3.2.0}"
39
+ USE_QUICTLS="${USE_QUICTLS:-0}"
40
+ QUICTLS_BRANCH="${QUICTLS_BRANCH:-openssl-3.1.7+quic}"
41
+ ANDROID_NDK="${ANDROID_NDK:-}"
42
+ ANDROID_ABI="${ANDROID_ABI:-arm64-v8a}"
43
+ ANDROID_PLATFORM="${ANDROID_PLATFORM:-android-21}"
44
+ INSTALL_PREFIX="${INSTALL_PREFIX:-$SCRIPT_DIR/install/openssl-android}"
45
+
46
+ # Parse arguments
47
+ while [[ $# -gt 0 ]]; do
48
+ case $1 in
49
+ --ndk-path)
50
+ ANDROID_NDK="$2"
51
+ shift 2
52
+ ;;
53
+ --abi)
54
+ ANDROID_ABI="$2"
55
+ shift 2
56
+ ;;
57
+ --platform)
58
+ ANDROID_PLATFORM="$2"
59
+ shift 2
60
+ ;;
61
+ --version)
62
+ OPENSSL_VERSION="$2"
63
+ shift 2
64
+ ;;
65
+ --quictls)
66
+ USE_QUICTLS=1
67
+ shift
68
+ ;;
69
+ --quictls-branch)
70
+ QUICTLS_BRANCH="$2"
71
+ USE_QUICTLS=1
72
+ shift 2
73
+ ;;
74
+ --prefix)
75
+ INSTALL_PREFIX="$2"
76
+ shift 2
77
+ ;;
78
+ *)
79
+ echo "Unknown option: $1"
80
+ echo "Usage: $0 [--ndk-path PATH] [--abi ABI] [--platform PLATFORM] [--version VERSION] [--quictls] [--quictls-branch BRANCH]"
81
+ exit 1
82
+ ;;
83
+ esac
84
+ done
85
+
86
+ # Find Android NDK
87
+ if [ -z "$ANDROID_NDK" ]; then
88
+ # Try common locations (macOS + Linux)
89
+ if [ -d "$HOME/Android/Sdk/ndk" ]; then
90
+ LATEST_NDK=$(ls -d "$HOME/Android/Sdk/ndk"/*/ 2>/dev/null | sort -V | tail -1)
91
+ if [ -n "$LATEST_NDK" ]; then
92
+ ANDROID_NDK="$LATEST_NDK"
93
+ fi
94
+ elif [ -d "$HOME/Library/Android/sdk/ndk" ]; then
95
+ LATEST_NDK=$(ls -d "$HOME/Library/Android/sdk/ndk"/*/ 2>/dev/null | sort -V | tail -1)
96
+ if [ -n "$LATEST_NDK" ]; then
97
+ ANDROID_NDK="$LATEST_NDK"
98
+ fi
99
+ fi
100
+
101
+ if [ -z "$ANDROID_NDK" ]; then
102
+ echo "Error: Android NDK not found. Please specify --ndk-path"
103
+ echo "Or set ANDROID_NDK environment variable"
104
+ exit 1
105
+ fi
106
+ fi
107
+
108
+ if [ ! -d "$ANDROID_NDK" ]; then
109
+ echo "Error: Android NDK directory not found: $ANDROID_NDK"
110
+ exit 1
111
+ fi
112
+
113
+ if [ "$USE_QUICTLS" = "1" ]; then
114
+ echo "Building quictls ($QUICTLS_BRANCH) for Android"
115
+ else
116
+ echo "Building OpenSSL $OPENSSL_VERSION for Android"
117
+ fi
118
+ echo " NDK Path: $ANDROID_NDK"
119
+ echo " ABI: $ANDROID_ABI"
120
+ echo " Platform: $ANDROID_PLATFORM"
121
+ # Make install prefix ABI-aware by default
122
+ if [[ "$INSTALL_PREFIX" != *"/$ANDROID_ABI" ]]; then
123
+ INSTALL_PREFIX="$INSTALL_PREFIX/$ANDROID_ABI"
124
+ fi
125
+
126
+ echo " Install Prefix: $INSTALL_PREFIX"
127
+
128
+ # Make install prefix ABI-aware by default
129
+ if [[ "$INSTALL_PREFIX" != *"/$ANDROID_ABI" ]]; then
130
+ INSTALL_PREFIX="$INSTALL_PREFIX/$ANDROID_ABI"
131
+ fi
132
+
133
+ # Check if OpenSSL/quictls source exists
134
+ if [ "$USE_QUICTLS" = "1" ]; then
135
+ OPENSSL_SOURCE_DIR="${OPENSSL_SOURCE_DIR:-$DEFAULT_OPENSSL_SOURCE_DIR}"
136
+ OPENSSL_REPO_URL="https://github.com/quictls/openssl.git"
137
+ OPENSSL_REPO_BRANCH="$QUICTLS_BRANCH"
138
+ else
139
+ OPENSSL_SOURCE_DIR="${OPENSSL_SOURCE_DIR:-$DEFAULT_OPENSSL_SOURCE_DIR}"
140
+ OPENSSL_REPO_URL="https://github.com/openssl/openssl.git"
141
+ OPENSSL_REPO_BRANCH="openssl-$OPENSSL_VERSION"
142
+ fi
143
+ if [ ! -d "$OPENSSL_SOURCE_DIR" ]; then
144
+ echo "OpenSSL source not found. Cloning..."
145
+ git clone --depth 1 --branch "$OPENSSL_REPO_BRANCH" \
146
+ "$OPENSSL_REPO_URL" "$OPENSSL_SOURCE_DIR" || \
147
+ git clone --depth 1 "$OPENSSL_REPO_URL" "$OPENSSL_SOURCE_DIR"
148
+ fi
149
+
150
+ # Validate quictls source when requested
151
+ if [ "$USE_QUICTLS" = "1" ]; then
152
+ if ! grep -q "SSL_provide_quic_data" "$OPENSSL_SOURCE_DIR/include/openssl/ssl.h.in" 2>/dev/null; then
153
+ echo "Error: OPENSSL_SOURCE_DIR does not appear to be quictls."
154
+ echo "Please clone quictls into $OPENSSL_SOURCE_DIR or set OPENSSL_SOURCE_DIR to a quictls checkout."
155
+ echo "Example:"
156
+ echo " git clone --depth 1 --branch $QUICTLS_BRANCH $OPENSSL_REPO_URL $OPENSSL_SOURCE_DIR"
157
+ exit 1
158
+ fi
159
+ fi
160
+
161
+ cd "$OPENSSL_SOURCE_DIR"
162
+
163
+ # Set up environment for Android cross-compilation
164
+ export ANDROID_NDK_ROOT="$ANDROID_NDK"
165
+ export ANDROID_NDK_HOME="$ANDROID_NDK"
166
+ # Pick correct host toolchain for macOS/Linux
167
+ HOST_TAG=""
168
+ UNAME_S="$(uname -s)"
169
+ UNAME_M="$(uname -m)"
170
+ HOST_TAG_CANDIDATES=()
171
+ if [ "$UNAME_S" = "Darwin" ]; then
172
+ if [ "$UNAME_M" = "arm64" ]; then
173
+ HOST_TAG_CANDIDATES=("darwin-arm64" "darwin-x86_64")
174
+ else
175
+ HOST_TAG_CANDIDATES=("darwin-x86_64" "darwin-arm64")
176
+ fi
177
+ else
178
+ HOST_TAG_CANDIDATES=("linux-x86_64")
179
+ fi
180
+
181
+ for tag in "${HOST_TAG_CANDIDATES[@]}"; do
182
+ if [ -d "$ANDROID_NDK/toolchains/llvm/prebuilt/$tag" ]; then
183
+ HOST_TAG="$tag"
184
+ break
185
+ fi
186
+ done
187
+
188
+ if [ -z "$HOST_TAG" ]; then
189
+ echo "Error: Could not find an NDK prebuilt toolchain for this host"
190
+ echo "Checked: ${HOST_TAG_CANDIDATES[*]}"
191
+ exit 1
192
+ fi
193
+
194
+ export PATH="$ANDROID_NDK/toolchains/llvm/prebuilt/$HOST_TAG/bin:$PATH"
195
+
196
+ # Determine platform name based on ABI
197
+ case "$ANDROID_ABI" in
198
+ arm64-v8a)
199
+ PLATFORM="android-arm64"
200
+ TOOLCHAIN_PREFIX="aarch64-linux-android"
201
+ ;;
202
+ armeabi-v7a)
203
+ PLATFORM="android-arm"
204
+ TOOLCHAIN_PREFIX="armv7a-linux-androideabi"
205
+ ;;
206
+ x86_64)
207
+ PLATFORM="android-x86_64"
208
+ TOOLCHAIN_PREFIX="x86_64-linux-android"
209
+ ;;
210
+ x86)
211
+ PLATFORM="android-x86"
212
+ TOOLCHAIN_PREFIX="i686-linux-android"
213
+ ;;
214
+ *)
215
+ echo "Error: Unsupported ABI: $ANDROID_ABI"
216
+ exit 1
217
+ ;;
218
+ esac
219
+
220
+ ANDROID_API=$(echo "$ANDROID_PLATFORM" | sed 's/android-//')
221
+ export ANDROID_API
222
+
223
+ # Use clang toolchain from NDK (gcc was removed in r23+)
224
+ export CC="${TOOLCHAIN_PREFIX}${ANDROID_API}-clang"
225
+ export CXX="${TOOLCHAIN_PREFIX}${ANDROID_API}-clang++"
226
+ export AR="llvm-ar"
227
+ export RANLIB="llvm-ranlib"
228
+ export LD="ld.lld"
229
+ export STRIP="llvm-strip"
230
+
231
+ # Clean previous build if it exists (important for QUIC support)
232
+ echo ""
233
+ echo "Cleaning previous OpenSSL build (if any)..."
234
+ if [ -f "Makefile" ] || [ -f "configdata.pm" ]; then
235
+ make distclean 2>/dev/null || true
236
+ rm -f configdata.pm Makefile 2>/dev/null || true
237
+ fi
238
+
239
+ # Configure OpenSSL
240
+ echo ""
241
+ echo "Configuring OpenSSL for $PLATFORM..."
242
+ QUIC_OPTION="enable-quic"
243
+
244
+ # quictls older branches may not support "no-apps"
245
+ NO_APPS_OPTION=""
246
+ if ./Configure list 2>/dev/null | grep -q "no-apps"; then
247
+ NO_APPS_OPTION="no-apps"
248
+ fi
249
+
250
+ ./Configure "$PLATFORM" \
251
+ --prefix="$INSTALL_PREFIX" \
252
+ --openssldir="$INSTALL_PREFIX/ssl" \
253
+ no-shared \
254
+ no-tests \
255
+ $NO_APPS_OPTION \
256
+ "$QUIC_OPTION" \
257
+ -D__ANDROID_API__="$ANDROID_API"
258
+
259
+ # Build
260
+ echo ""
261
+ echo "Building OpenSSL..."
262
+ # Build everything, but allow failures in apps/providers
263
+ make -k -j$(nproc 2>/dev/null || sysctl -n hw.ncpu) || true
264
+
265
+ # Verify that the required libraries were built
266
+ if [ ! -f "libcrypto.a" ] || [ ! -f "libssl.a" ]; then
267
+ echo "Error: Required libraries were not built"
268
+ echo "Attempting to build libraries directly..."
269
+ make libcrypto.a libssl.a -j$(nproc 2>/dev/null || sysctl -n hw.ncpu) || {
270
+ echo "Error: Failed to build libcrypto.a and libssl.a"
271
+ exit 1
272
+ }
273
+ fi
274
+
275
+ # Install
276
+ echo ""
277
+ echo "Installing OpenSSL..."
278
+ make -k install_sw || {
279
+ echo "Warning: install_sw had some errors, but checking if libraries were installed..."
280
+ if [ -f "libcrypto.a" ] && [ -f "libssl.a" ]; then
281
+ echo "Copying libraries manually..."
282
+ mkdir -p "$INSTALL_PREFIX/lib"
283
+ cp libcrypto.a libssl.a "$INSTALL_PREFIX/lib/" 2>/dev/null || true
284
+ echo "Copying headers manually..."
285
+ mkdir -p "$INSTALL_PREFIX/include"
286
+ cp -r include/openssl "$INSTALL_PREFIX/include/" 2>/dev/null || true
287
+ fi
288
+ }
289
+
290
+ if [ "$USE_QUICTLS" = "1" ]; then
291
+ if ! grep -q "SSL_provide_quic_data" "$INSTALL_PREFIX/include/openssl/ssl.h" 2>/dev/null; then
292
+ echo "Error: Installed OpenSSL headers do not include QUIC APIs."
293
+ echo "Ensure OPENSSL_SOURCE_DIR points to a quictls checkout."
294
+ exit 1
295
+ fi
296
+ fi
297
+
298
+ echo ""
299
+ echo "OpenSSL build complete!"
300
+ echo "Installation directory: $INSTALL_PREFIX"
301
+ echo "Libraries: $INSTALL_PREFIX/lib"
302
+ echo "Headers: $INSTALL_PREFIX/include"
@@ -0,0 +1,75 @@
1
+ ext {
2
+ junitVersion = project.hasProperty('junitVersion') ? rootProject.ext.junitVersion : '4.13.2'
3
+ androidxJunitVersion = project.hasProperty('androidxJunitVersion') ? rootProject.ext.androidxJunitVersion : '1.2.1'
4
+ androidxEspressoCoreVersion = project.hasProperty('androidxEspressoCoreVersion') ? rootProject.ext.androidxEspressoCoreVersion : '3.6.1'
5
+ }
6
+
7
+ buildscript {
8
+ ext.kotlin_version = '1.9.24'
9
+ repositories {
10
+ google()
11
+ mavenCentral()
12
+ }
13
+ dependencies {
14
+ classpath 'com.android.tools.build:gradle:8.7.2'
15
+ classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version"
16
+ }
17
+ }
18
+
19
+ apply plugin: 'com.android.library'
20
+ apply plugin: 'org.jetbrains.kotlin.android'
21
+
22
+ android {
23
+ namespace "ai.annadata.mqttquic"
24
+ compileSdk project.hasProperty('compileSdkVersion') ? rootProject.ext.compileSdkVersion : 35
25
+ defaultConfig {
26
+ minSdk project.hasProperty('minSdkVersion') ? rootProject.ext.minSdkVersion : 23
27
+ targetSdk project.hasProperty('targetSdkVersion') ? rootProject.ext.targetSdkVersion : 35
28
+ versionCode 1
29
+ versionName "0.1.0"
30
+ testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
31
+ externalNativeBuild {
32
+ cmake {
33
+ arguments "-DANDROID_STL=c++_shared"
34
+ cppFlags "-std=c++17"
35
+ }
36
+ }
37
+ ndk {
38
+ abiFilters 'arm64-v8a', 'armeabi-v7a', 'x86_64'
39
+ }
40
+ }
41
+ buildTypes {
42
+ release {
43
+ minifyEnabled false
44
+ proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
45
+ }
46
+ }
47
+ compileOptions {
48
+ sourceCompatibility JavaVersion.VERSION_17
49
+ targetCompatibility JavaVersion.VERSION_17
50
+ }
51
+ kotlinOptions {
52
+ jvmTarget = '17'
53
+ }
54
+ externalNativeBuild {
55
+ cmake {
56
+ path "src/main/cpp/CMakeLists.txt"
57
+ version "3.22.1"
58
+ }
59
+ }
60
+ }
61
+
62
+ repositories {
63
+ google()
64
+ mavenCentral()
65
+ }
66
+
67
+ dependencies {
68
+ implementation fileTree(dir: 'libs', include: ['*.jar'])
69
+ implementation project(':capacitor-android')
70
+ implementation "org.jetbrains.kotlin:kotlin-stdlib-jdk8:$kotlin_version"
71
+ implementation 'org.jetbrains.kotlinx:kotlinx-coroutines-android:1.7.3'
72
+ testImplementation "junit:junit:$junitVersion"
73
+ androidTestImplementation "androidx.test.ext:junit:$androidxJunitVersion"
74
+ androidTestImplementation "androidx.test.espresso:espresso-core:$androidxEspressoCoreVersion"
75
+ }
@@ -0,0 +1,3 @@
1
+ android.useAndroidX=true
2
+ kotlin.code.style=official
3
+ kotlin_version=1.9.24
@@ -0,0 +1,2 @@
1
+ # Add project specific ProGuard rules here.
2
+ -keep class ai.annadata.mqttquic.** { *; }
@@ -0,0 +1 @@
1
+ rootProject.name = 'capacitor-mqtt-quic'
@@ -0,0 +1 @@
1
+ <manifest xmlns:android="http://schemas.android.com/apk/res/android" />
@@ -0,0 +1,5 @@
1
+ # Replace this file with your CA certificate bundle (PEM).
2
+ # Example:
3
+ # -----BEGIN CERTIFICATE-----
4
+ # ...
5
+ # -----END CERTIFICATE-----
@@ -0,0 +1,157 @@
1
+ cmake_minimum_required(VERSION 3.20)
2
+ project(ngtcp2_client)
3
+
4
+ # Set Android-specific flags
5
+ set(CMAKE_SYSTEM_NAME Android)
6
+ set(CMAKE_ANDROID_ARCH_ABI ${ANDROID_ABI})
7
+ set(CMAKE_ANDROID_NDK ${ANDROID_NDK})
8
+
9
+ # Android API level
10
+ if(NOT ANDROID_PLATFORM)
11
+ set(ANDROID_PLATFORM android-21)
12
+ endif()
13
+
14
+ # Default OpenSSL path (can be overridden via -DOPENSSL_ROOT_DIR=...)
15
+ if(NOT OPENSSL_ROOT_DIR)
16
+ set(OPENSSL_ROOT_DIR "${CMAKE_CURRENT_SOURCE_DIR}/../../install/openssl-android" CACHE PATH "Path to OpenSSL for Android")
17
+ # ABI-aware layout: allow installs under .../openssl-android/<abi>
18
+ if(EXISTS "${OPENSSL_ROOT_DIR}/${ANDROID_ABI}")
19
+ set(OPENSSL_ROOT_DIR "${OPENSSL_ROOT_DIR}/${ANDROID_ABI}" CACHE PATH "Path to OpenSSL for Android (ABI)" FORCE)
20
+ endif()
21
+ endif()
22
+
23
+ # Help FindOpenSSL by pointing at explicit locations when present
24
+ if(NOT OPENSSL_INCLUDE_DIR AND EXISTS "${OPENSSL_ROOT_DIR}/include")
25
+ set(OPENSSL_INCLUDE_DIR "${OPENSSL_ROOT_DIR}/include")
26
+ endif()
27
+ if(NOT OPENSSL_CRYPTO_LIBRARY AND EXISTS "${OPENSSL_ROOT_DIR}/lib/libcrypto.a")
28
+ set(OPENSSL_CRYPTO_LIBRARY "${OPENSSL_ROOT_DIR}/lib/libcrypto.a")
29
+ endif()
30
+ if(NOT OPENSSL_SSL_LIBRARY AND EXISTS "${OPENSSL_ROOT_DIR}/lib/libssl.a")
31
+ set(OPENSSL_SSL_LIBRARY "${OPENSSL_ROOT_DIR}/lib/libssl.a")
32
+ endif()
33
+
34
+ # Find required packages
35
+ find_package(OpenSSL REQUIRED)
36
+
37
+ # ngtcp2 install/source directories (adjust as needed)
38
+ if(NOT NGTCP2_INSTALL_DIR)
39
+ set(NGTCP2_INSTALL_DIR "${CMAKE_CURRENT_SOURCE_DIR}/../../build/android-${ANDROID_ABI}/install" CACHE PATH "Path to ngtcp2 install")
40
+ if(EXISTS "${CMAKE_CURRENT_SOURCE_DIR}/../../install/ngtcp2-android/${ANDROID_ABI}")
41
+ set(NGTCP2_INSTALL_DIR "${CMAKE_CURRENT_SOURCE_DIR}/../../install/ngtcp2-android/${ANDROID_ABI}" CACHE PATH "Path to ngtcp2 install (ABI)" FORCE)
42
+ endif()
43
+ endif()
44
+ set(NGTCP2_SOURCE_DIR "${CMAKE_CURRENT_SOURCE_DIR}/../../../../ngtcp2" CACHE PATH "Path to ngtcp2 source")
45
+
46
+ # nghttp3 install/source directories (adjust as needed)
47
+ if(NOT NGHTTP3_INSTALL_DIR)
48
+ set(NGHTTP3_INSTALL_DIR "${CMAKE_CURRENT_SOURCE_DIR}/../../build/nghttp3-android-${ANDROID_ABI}/install" CACHE PATH "Path to nghttp3 install")
49
+ if(EXISTS "${CMAKE_CURRENT_SOURCE_DIR}/../../install/nghttp3-android/${ANDROID_ABI}")
50
+ set(NGHTTP3_INSTALL_DIR "${CMAKE_CURRENT_SOURCE_DIR}/../../install/nghttp3-android/${ANDROID_ABI}" CACHE PATH "Path to nghttp3 install (ABI)" FORCE)
51
+ endif()
52
+ endif()
53
+ set(NGHTTP3_SOURCE_DIR "${CMAKE_CURRENT_SOURCE_DIR}/../../../../nghttp3" CACHE PATH "Path to nghttp3 source")
54
+
55
+ # Prefer installed libraries, fallback to source build
56
+ set(NGTCP2_INCLUDE_DIR "")
57
+ set(NGTCP2_LIBRARY "")
58
+ set(NGTCP2_CRYPTO_LIBRARY "")
59
+ if(EXISTS "${NGTCP2_INSTALL_DIR}/include/ngtcp2/ngtcp2.h")
60
+ set(NGTCP2_INCLUDE_DIR "${NGTCP2_INSTALL_DIR}/include")
61
+ if(EXISTS "${NGTCP2_INSTALL_DIR}/lib/libngtcp2.a")
62
+ set(NGTCP2_LIBRARY "${NGTCP2_INSTALL_DIR}/lib/libngtcp2.a")
63
+ elseif(EXISTS "${NGTCP2_INSTALL_DIR}/lib/libngtcp2.so")
64
+ set(NGTCP2_LIBRARY "${NGTCP2_INSTALL_DIR}/lib/libngtcp2.so")
65
+ endif()
66
+ if(EXISTS "${NGTCP2_INSTALL_DIR}/lib/libngtcp2_crypto_quictls.a")
67
+ set(NGTCP2_CRYPTO_LIBRARY "${NGTCP2_INSTALL_DIR}/lib/libngtcp2_crypto_quictls.a")
68
+ elseif(EXISTS "${NGTCP2_INSTALL_DIR}/lib/libngtcp2_crypto_quictls.so")
69
+ set(NGTCP2_CRYPTO_LIBRARY "${NGTCP2_INSTALL_DIR}/lib/libngtcp2_crypto_quictls.so")
70
+ endif()
71
+ else()
72
+ if(NOT EXISTS "${NGTCP2_SOURCE_DIR}/lib/includes/ngtcp2/ngtcp2.h" AND NOT EXISTS "${NGTCP2_SOURCE_DIR}/lib/ngtcp2.h")
73
+ message(WARNING "ngtcp2 source not found at ${NGTCP2_SOURCE_DIR}")
74
+ message(WARNING "Please set NGTCP2_SOURCE_DIR or clone ngtcp2:")
75
+ message(WARNING " git clone https://github.com/ngtcp2/ngtcp2.git")
76
+ endif()
77
+ if(EXISTS "${NGTCP2_SOURCE_DIR}/CMakeLists.txt")
78
+ add_subdirectory(${NGTCP2_SOURCE_DIR} ngtcp2_lib)
79
+ endif()
80
+ endif()
81
+
82
+ set(NGHTTP3_INCLUDE_DIR "")
83
+ set(NGHTTP3_LIBRARY "")
84
+ if(EXISTS "${NGHTTP3_INSTALL_DIR}/include/nghttp3/nghttp3.h")
85
+ set(NGHTTP3_INCLUDE_DIR "${NGHTTP3_INSTALL_DIR}/include")
86
+ if(EXISTS "${NGHTTP3_INSTALL_DIR}/lib/libnghttp3.a")
87
+ set(NGHTTP3_LIBRARY "${NGHTTP3_INSTALL_DIR}/lib/libnghttp3.a")
88
+ elseif(EXISTS "${NGHTTP3_INSTALL_DIR}/lib/libnghttp3.so")
89
+ set(NGHTTP3_LIBRARY "${NGHTTP3_INSTALL_DIR}/lib/libnghttp3.so")
90
+ endif()
91
+ else()
92
+ if(NOT EXISTS "${NGHTTP3_SOURCE_DIR}/lib/includes/nghttp3/nghttp3.h" AND NOT EXISTS "${NGHTTP3_SOURCE_DIR}/lib/nghttp3.h")
93
+ message(WARNING "nghttp3 source not found at ${NGHTTP3_SOURCE_DIR}")
94
+ message(WARNING "Please set NGHTTP3_SOURCE_DIR or clone nghttp3:")
95
+ message(WARNING " git clone https://github.com/ngtcp2/nghttp3.git")
96
+ endif()
97
+ if(EXISTS "${NGHTTP3_SOURCE_DIR}/CMakeLists.txt")
98
+ add_subdirectory(${NGHTTP3_SOURCE_DIR} nghttp3_lib)
99
+ endif()
100
+ endif()
101
+
102
+ # JNI source files
103
+ set(JNI_SOURCES
104
+ ngtcp2_jni.cpp
105
+ )
106
+
107
+ # Create shared library
108
+ add_library(ngtcp2_client SHARED ${JNI_SOURCES})
109
+
110
+ # Include directories
111
+ target_include_directories(ngtcp2_client PRIVATE
112
+ ${CMAKE_CURRENT_SOURCE_DIR}
113
+ ${NGTCP2_INCLUDE_DIR}
114
+ ${NGHTTP3_INCLUDE_DIR}
115
+ ${NGTCP2_SOURCE_DIR}/lib/includes
116
+ ${NGHTTP3_SOURCE_DIR}/lib/includes
117
+ ${OpenSSL_INCLUDE_DIR}
118
+ )
119
+
120
+ # Link libraries
121
+ target_link_libraries(ngtcp2_client
122
+ # OpenSSL
123
+ ${OpenSSL_LIBRARIES}
124
+ # Android log
125
+ log
126
+ )
127
+
128
+ if(TARGET ngtcp2)
129
+ target_link_libraries(ngtcp2_client PRIVATE ngtcp2)
130
+ elseif(NGTCP2_LIBRARY)
131
+ target_link_libraries(ngtcp2_client PRIVATE ${NGTCP2_LIBRARY})
132
+ endif()
133
+
134
+ if(TARGET nghttp3)
135
+ target_link_libraries(ngtcp2_client PRIVATE nghttp3)
136
+ elseif(NGHTTP3_LIBRARY)
137
+ target_link_libraries(ngtcp2_client PRIVATE ${NGHTTP3_LIBRARY})
138
+ endif()
139
+
140
+ if(NGTCP2_CRYPTO_LIBRARY)
141
+ target_link_libraries(ngtcp2_client PRIVATE ${NGTCP2_CRYPTO_LIBRARY})
142
+ endif()
143
+
144
+ # Compiler flags
145
+ target_compile_options(ngtcp2_client PRIVATE
146
+ -Wall
147
+ -Wextra
148
+ -Wno-unused-parameter
149
+ -fexceptions
150
+ -frtti
151
+ )
152
+
153
+ # C++ standard
154
+ set_target_properties(ngtcp2_client PROPERTIES
155
+ CXX_STANDARD 17
156
+ CXX_STANDARD_REQUIRED ON
157
+ )