@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,182 @@
1
+ #!/bin/bash
2
+ #
3
+ # Build script for nghttp3 on Android
4
+ #
5
+ # This script builds nghttp3 as a static library for Android using NDK.
6
+ # It requires:
7
+ # - Android NDK r25+
8
+ # - CMake 3.20+
9
+ #
10
+ # Usage:
11
+ # ./build-nghttp3.sh [--ndk-path PATH] [--abi ABI] [--platform PLATFORM] [--prefix PATH]
12
+ #
13
+ # Example:
14
+ # ./build-nghttp3.sh --ndk-path ~/Android/Sdk/ndk/25.2.9519653 --abi arm64-v8a --platform android-21
15
+ #
16
+
17
+ set -e
18
+
19
+ # Default values
20
+ ANDROID_NDK="${ANDROID_NDK:-}"
21
+ ANDROID_ABI="${ANDROID_ABI:-arm64-v8a}"
22
+ ANDROID_PLATFORM="${ANDROID_PLATFORM:-android-21}"
23
+ BUILD_TYPE="${BUILD_TYPE:-Release}"
24
+ SCRIPT_DIR="$(cd "$(dirname "$0")" && pwd)"
25
+ if [ -n "$PROJECT_DIR" ]; then
26
+ REF_CODE_DIR="$(cd "$PROJECT_DIR/ref-code" && pwd)"
27
+ else
28
+ REF_CODE_DIR="$(cd "$SCRIPT_DIR/../.." && pwd)"
29
+ fi
30
+ INSTALL_PREFIX="${INSTALL_PREFIX:-$SCRIPT_DIR/install/nghttp3-android}"
31
+
32
+ # Parse arguments
33
+ while [[ $# -gt 0 ]]; do
34
+ case $1 in
35
+ --ndk-path)
36
+ ANDROID_NDK="$2"
37
+ shift 2
38
+ ;;
39
+ --abi)
40
+ ANDROID_ABI="$2"
41
+ shift 2
42
+ ;;
43
+ --platform)
44
+ ANDROID_PLATFORM="$2"
45
+ shift 2
46
+ ;;
47
+ --build-type)
48
+ BUILD_TYPE="$2"
49
+ shift 2
50
+ ;;
51
+ --prefix)
52
+ INSTALL_PREFIX="$2"
53
+ shift 2
54
+ ;;
55
+ *)
56
+ echo "Unknown option: $1"
57
+ echo "Usage: $0 [--ndk-path PATH] [--abi ABI] [--platform PLATFORM] [--prefix PATH]"
58
+ exit 1
59
+ ;;
60
+ esac
61
+ done
62
+
63
+ # Check prerequisites
64
+ if ! command -v cmake &> /dev/null; then
65
+ echo "Error: CMake is not installed. Please install CMake 3.20+"
66
+ exit 1
67
+ fi
68
+
69
+ # Find Android NDK
70
+ if [ -z "$ANDROID_NDK" ]; then
71
+ if [ -d "$HOME/Android/Sdk/ndk" ]; then
72
+ LATEST_NDK=$(ls -d "$HOME/Android/Sdk/ndk"/*/ 2>/dev/null | sort -V | tail -1)
73
+ if [ -n "$LATEST_NDK" ]; then
74
+ ANDROID_NDK="$LATEST_NDK"
75
+ fi
76
+ elif [ -d "$HOME/Library/Android/sdk/ndk" ]; then
77
+ LATEST_NDK=$(ls -d "$HOME/Library/Android/sdk/ndk"/*/ 2>/dev/null | sort -V | tail -1)
78
+ if [ -n "$LATEST_NDK" ]; then
79
+ ANDROID_NDK="$LATEST_NDK"
80
+ fi
81
+ fi
82
+ if [ -z "$ANDROID_NDK" ]; then
83
+ echo "Error: Android NDK not found. Please specify --ndk-path"
84
+ echo "Or set ANDROID_NDK environment variable"
85
+ exit 1
86
+ fi
87
+ fi
88
+
89
+ if [ ! -d "$ANDROID_NDK" ]; then
90
+ echo "Error: Android NDK directory not found: $ANDROID_NDK"
91
+ exit 1
92
+ fi
93
+
94
+ echo "Building nghttp3 for Android"
95
+ echo " NDK Path: $ANDROID_NDK"
96
+ echo " ABI: $ANDROID_ABI"
97
+ echo " Platform: $ANDROID_PLATFORM"
98
+ echo " Build Type: $BUILD_TYPE"
99
+ if [[ "$INSTALL_PREFIX" != *"/$ANDROID_ABI" ]]; then
100
+ INSTALL_PREFIX="$INSTALL_PREFIX/$ANDROID_ABI"
101
+ fi
102
+ echo " Install Prefix: $INSTALL_PREFIX"
103
+
104
+ # Check if nghttp3 source exists
105
+ if [ -n "$NGHTTP3_SOURCE_DIR" ]; then
106
+ if [[ "$NGHTTP3_SOURCE_DIR" != /* ]]; then
107
+ NGHTTP3_SOURCE_DIR="$REF_CODE_DIR/$NGHTTP3_SOURCE_DIR"
108
+ fi
109
+ else
110
+ NGHTTP3_SOURCE_DIR="$REF_CODE_DIR/nghttp3"
111
+ fi
112
+ if [ ! -d "$NGHTTP3_SOURCE_DIR" ] && [ -d "$REF_CODE_DIR/nghttp3" ]; then
113
+ echo "Warning: NGHTTP3_SOURCE_DIR not found; using $REF_CODE_DIR/nghttp3"
114
+ NGHTTP3_SOURCE_DIR="$REF_CODE_DIR/nghttp3"
115
+ fi
116
+ if [ ! -d "$NGHTTP3_SOURCE_DIR" ]; then
117
+ echo "Error: nghttp3 source directory not found: $NGHTTP3_SOURCE_DIR"
118
+ echo "Please set NGHTTP3_SOURCE_DIR environment variable or clone nghttp3:"
119
+ echo " git clone --recurse-submodules https://github.com/ngtcp2/nghttp3.git $NGHTTP3_SOURCE_DIR"
120
+ exit 1
121
+ fi
122
+
123
+ # Ensure required submodules are present (sfparse, munit)
124
+ if [ ! -f "$NGHTTP3_SOURCE_DIR/sfparse/sfparse.c" ] || [ ! -f "$NGHTTP3_SOURCE_DIR/munit/munit.c" ]; then
125
+ if [ -d "$NGHTTP3_SOURCE_DIR/.git" ]; then
126
+ echo "Initializing nghttp3 submodules..."
127
+ (cd "$NGHTTP3_SOURCE_DIR" && git submodule update --init --recursive) || {
128
+ echo "Error: Failed to initialize nghttp3 submodules"
129
+ exit 1
130
+ }
131
+ else
132
+ echo "Error: nghttp3 submodules are missing (sfparse/munit)"
133
+ echo "Please clone with submodules:"
134
+ echo " git clone --recurse-submodules https://github.com/ngtcp2/nghttp3.git $NGHTTP3_SOURCE_DIR"
135
+ echo "Or if already cloned:"
136
+ echo " cd $NGHTTP3_SOURCE_DIR && git submodule update --init --recursive"
137
+ exit 1
138
+ fi
139
+ fi
140
+
141
+ # Create build directory
142
+ BUILD_DIR="build/nghttp3-android-$ANDROID_ABI"
143
+ mkdir -p "$BUILD_DIR"
144
+
145
+ # Clean build dir if CMake cache points to a different source tree
146
+ if [ -f "$BUILD_DIR/CMakeCache.txt" ]; then
147
+ CMAKE_HOME_DIR=$(grep "^CMAKE_HOME_DIRECTORY:INTERNAL=" "$BUILD_DIR/CMakeCache.txt" | cut -d= -f2-)
148
+ if [ -n "$CMAKE_HOME_DIR" ] && [ "$CMAKE_HOME_DIR" != "$NGHTTP3_SOURCE_DIR" ]; then
149
+ echo "CMake cache source mismatch. Cleaning $BUILD_DIR"
150
+ rm -rf "$BUILD_DIR"
151
+ mkdir -p "$BUILD_DIR"
152
+ fi
153
+ fi
154
+
155
+ cd "$BUILD_DIR"
156
+
157
+ # Configure CMake
158
+ CMAKE_ARGS=(
159
+ -DCMAKE_TOOLCHAIN_FILE="$ANDROID_NDK/build/cmake/android.toolchain.cmake"
160
+ -DANDROID_ABI="$ANDROID_ABI"
161
+ -DANDROID_PLATFORM="$ANDROID_PLATFORM"
162
+ -DCMAKE_BUILD_TYPE="$BUILD_TYPE"
163
+ -DENABLE_LIB_ONLY=ON
164
+ -DCMAKE_INSTALL_PREFIX="$INSTALL_PREFIX"
165
+ )
166
+
167
+ echo ""
168
+ echo "Configuring CMake..."
169
+ cmake "$NGHTTP3_SOURCE_DIR" "${CMAKE_ARGS[@]}"
170
+
171
+ echo ""
172
+ echo "Building nghttp3..."
173
+ cmake --build . --config "$BUILD_TYPE" -j$(nproc 2>/dev/null || sysctl -n hw.ncpu)
174
+
175
+ echo ""
176
+ echo "Installing..."
177
+ cmake --install .
178
+
179
+ echo ""
180
+ echo "Build complete!"
181
+ echo "Library: $INSTALL_PREFIX/lib/libnghttp3.a"
182
+ echo "Headers: $INSTALL_PREFIX/include"
@@ -0,0 +1,289 @@
1
+ #!/bin/bash
2
+ #
3
+ # Build script for ngtcp2 on Android
4
+ #
5
+ # This script builds ngtcp2 as a native library for Android using NDK.
6
+ # It requires:
7
+ # - Android NDK r25+
8
+ # - CMake 3.20+
9
+ # - OpenSSL 3.0+ (built for Android)
10
+ #
11
+ # Usage:
12
+ # ./build-ngtcp2.sh [--ndk-path PATH] [--abi ABI] [--platform PLATFORM] [--openssl-path PATH] [--prefix PATH] [--quictls]
13
+ #
14
+ # Example:
15
+ # ./build-ngtcp2.sh --ndk-path ~/Android/Sdk/ndk/25.2.9519653 --abi arm64-v8a --platform android-21
16
+ #
17
+
18
+ set -e
19
+
20
+ # Default values
21
+ ANDROID_NDK="${ANDROID_NDK:-}"
22
+ ANDROID_ABI="${ANDROID_ABI:-arm64-v8a}"
23
+ ANDROID_PLATFORM="${ANDROID_PLATFORM:-android-21}"
24
+ BUILD_TYPE="${BUILD_TYPE:-Release}"
25
+ OPENSSL_PATH="${OPENSSL_PATH:-}"
26
+ USE_QUICTLS="${USE_QUICTLS:-0}"
27
+ SCRIPT_DIR="$(cd "$(dirname "$0")" && pwd)"
28
+ if [ -n "$PROJECT_DIR" ]; then
29
+ # PROJECT_DIR is the capacitor-mqtt-quic repo root
30
+ REF_CODE_DIR="$(cd "$PROJECT_DIR/ref-code" && pwd)"
31
+ else
32
+ # Fallback: repo root is one level above android/
33
+ REF_CODE_DIR="$(cd "$SCRIPT_DIR/../ref-code" && pwd)"
34
+ fi
35
+ INSTALL_PREFIX="${INSTALL_PREFIX:-$SCRIPT_DIR/install/ngtcp2-android}"
36
+
37
+ # Parse arguments
38
+ while [[ $# -gt 0 ]]; do
39
+ case $1 in
40
+ --ndk-path)
41
+ ANDROID_NDK="$2"
42
+ shift 2
43
+ ;;
44
+ --abi)
45
+ ANDROID_ABI="$2"
46
+ shift 2
47
+ ;;
48
+ --platform)
49
+ ANDROID_PLATFORM="$2"
50
+ shift 2
51
+ ;;
52
+ --build-type)
53
+ BUILD_TYPE="$2"
54
+ shift 2
55
+ ;;
56
+ --openssl-path)
57
+ OPENSSL_PATH="$2"
58
+ shift 2
59
+ ;;
60
+ --prefix)
61
+ INSTALL_PREFIX="$2"
62
+ shift 2
63
+ ;;
64
+ --quictls)
65
+ USE_QUICTLS=1
66
+ shift
67
+ ;;
68
+ *)
69
+ echo "Unknown option: $1"
70
+ echo "Usage: $0 [--ndk-path PATH] [--abi ABI] [--platform PLATFORM] [--openssl-path PATH] [--prefix PATH] [--quictls]"
71
+ exit 1
72
+ ;;
73
+ esac
74
+ done
75
+
76
+ # Check prerequisites
77
+ if ! command -v cmake &> /dev/null; then
78
+ echo "Error: CMake is not installed. Please install CMake 3.20+"
79
+ exit 1
80
+ fi
81
+
82
+ # Find Android NDK
83
+ if [ -z "$ANDROID_NDK" ]; then
84
+ # Try common locations (macOS + Linux)
85
+ if [ -d "$HOME/Android/Sdk/ndk" ]; then
86
+ # Find latest NDK version
87
+ LATEST_NDK=$(ls -d "$HOME/Android/Sdk/ndk"/*/ 2>/dev/null | sort -V | tail -1)
88
+ if [ -n "$LATEST_NDK" ]; then
89
+ ANDROID_NDK="$LATEST_NDK"
90
+ fi
91
+ elif [ -d "$HOME/Library/Android/sdk/ndk" ]; then
92
+ LATEST_NDK=$(ls -d "$HOME/Library/Android/sdk/ndk"/*/ 2>/dev/null | sort -V | tail -1)
93
+ if [ -n "$LATEST_NDK" ]; then
94
+ ANDROID_NDK="$LATEST_NDK"
95
+ fi
96
+ fi
97
+
98
+ if [ -z "$ANDROID_NDK" ]; then
99
+ echo "Error: Android NDK not found. Please specify --ndk-path"
100
+ echo "Or set ANDROID_NDK environment variable"
101
+ exit 1
102
+ fi
103
+ fi
104
+
105
+ if [ ! -d "$ANDROID_NDK" ]; then
106
+ echo "Error: Android NDK directory not found: $ANDROID_NDK"
107
+ exit 1
108
+ fi
109
+
110
+ echo "Building ngtcp2 for Android"
111
+ echo " NDK Path: $ANDROID_NDK"
112
+ echo " ABI: $ANDROID_ABI"
113
+ echo " Platform: $ANDROID_PLATFORM"
114
+ echo " Build Type: $BUILD_TYPE"
115
+ if [[ "$INSTALL_PREFIX" != *"/$ANDROID_ABI" ]]; then
116
+ INSTALL_PREFIX="$INSTALL_PREFIX/$ANDROID_ABI"
117
+ fi
118
+ echo " Install Prefix: $INSTALL_PREFIX"
119
+
120
+ # Check if ngtcp2 source exists
121
+ if [ -n "$NGTCP2_SOURCE_DIR" ]; then
122
+ if [[ "$NGTCP2_SOURCE_DIR" != /* ]]; then
123
+ NGTCP2_SOURCE_DIR="$REF_CODE_DIR/$NGTCP2_SOURCE_DIR"
124
+ fi
125
+ else
126
+ NGTCP2_SOURCE_DIR="$REF_CODE_DIR/ngtcp2"
127
+ fi
128
+ if [ ! -d "$NGTCP2_SOURCE_DIR" ] && [ -d "$REF_CODE_DIR/ngtcp2" ]; then
129
+ echo "Warning: NGTCP2_SOURCE_DIR not found; using $REF_CODE_DIR/ngtcp2"
130
+ NGTCP2_SOURCE_DIR="$REF_CODE_DIR/ngtcp2"
131
+ fi
132
+ if [ ! -d "$NGTCP2_SOURCE_DIR" ]; then
133
+ echo "Error: ngtcp2 source directory not found: $NGTCP2_SOURCE_DIR"
134
+ echo "Please set NGTCP2_SOURCE_DIR environment variable or clone ngtcp2:"
135
+ echo " git clone https://github.com/ngtcp2/ngtcp2.git $NGTCP2_SOURCE_DIR"
136
+ exit 1
137
+ fi
138
+
139
+ # Ensure required submodules are present (munit)
140
+ if [ ! -f "$NGTCP2_SOURCE_DIR/munit/munit.c" ]; then
141
+ if [ -d "$NGTCP2_SOURCE_DIR/.git" ]; then
142
+ echo "Initializing ngtcp2 submodules..."
143
+ (cd "$NGTCP2_SOURCE_DIR" && git submodule update --init --recursive) || {
144
+ echo "Error: Failed to initialize ngtcp2 submodules"
145
+ exit 1
146
+ }
147
+ else
148
+ echo "Warning: ngtcp2 submodules are missing (munit)"
149
+ echo "Tests will be disabled, but if configuration still fails, clone with submodules:"
150
+ echo " git clone --recurse-submodules https://github.com/ngtcp2/ngtcp2.git $NGTCP2_SOURCE_DIR"
151
+ fi
152
+ fi
153
+
154
+ # Check OpenSSL
155
+ if [ -z "$OPENSSL_PATH" ]; then
156
+ echo "Warning: OpenSSL path not specified. ngtcp2 will be built without TLS support."
157
+ echo "To build with OpenSSL, use: --openssl-path /path/to/openssl-android"
158
+ echo ""
159
+ echo "You can build OpenSSL for Android using build-openssl.sh"
160
+ fi
161
+
162
+ # Create build directory
163
+ BUILD_DIR="build/android-$ANDROID_ABI"
164
+ mkdir -p "$BUILD_DIR"
165
+
166
+ # Clean build dir if CMake cache points to a different source tree
167
+ if [ -f "$BUILD_DIR/CMakeCache.txt" ]; then
168
+ CMAKE_HOME_DIR=$(grep "^CMAKE_HOME_DIRECTORY:INTERNAL=" "$BUILD_DIR/CMakeCache.txt" | cut -d= -f2-)
169
+ if [ -n "$CMAKE_HOME_DIR" ] && [ "$CMAKE_HOME_DIR" != "$NGTCP2_SOURCE_DIR" ]; then
170
+ echo "CMake cache source mismatch. Cleaning $BUILD_DIR"
171
+ rm -rf "$BUILD_DIR"
172
+ mkdir -p "$BUILD_DIR"
173
+ fi
174
+ fi
175
+
176
+ cd "$BUILD_DIR"
177
+
178
+ # Configure CMake
179
+ CMAKE_ARGS=(
180
+ -DCMAKE_TOOLCHAIN_FILE="$ANDROID_NDK/build/cmake/android.toolchain.cmake"
181
+ -DANDROID_ABI="$ANDROID_ABI"
182
+ -DANDROID_PLATFORM="$ANDROID_PLATFORM"
183
+ -DCMAKE_BUILD_TYPE="$BUILD_TYPE"
184
+ -DENABLE_LIB_ONLY=ON
185
+ -DENABLE_TESTS=OFF
186
+ -DENABLE_EXAMPLES=OFF
187
+ -DCMAKE_INSTALL_PREFIX="$INSTALL_PREFIX"
188
+ )
189
+
190
+ if [ -n "$OPENSSL_PATH" ]; then
191
+ if [[ "$OPENSSL_PATH" != /* ]]; then
192
+ if [ -d "$SCRIPT_DIR/$OPENSSL_PATH" ]; then
193
+ OPENSSL_PATH="$SCRIPT_DIR/$OPENSSL_PATH"
194
+ else
195
+ OPENSSL_PATH="$REF_CODE_DIR/$OPENSSL_PATH"
196
+ fi
197
+ fi
198
+ # If ABI-aware install exists, prefer it
199
+ if [ -d "$OPENSSL_PATH/$ANDROID_ABI" ]; then
200
+ OPENSSL_PATH="$OPENSSL_PATH/$ANDROID_ABI"
201
+ fi
202
+ if [ ! -d "$OPENSSL_PATH" ]; then
203
+ echo "Error: OpenSSL path does not exist: $OPENSSL_PATH"
204
+ exit 1
205
+ fi
206
+ OPENSSL_PATH="$(cd "$OPENSSL_PATH" && pwd)"
207
+ OPENSSL_LIB_DIR="$OPENSSL_PATH/lib"
208
+ OPENSSL_INCLUDE_DIR="$OPENSSL_PATH/include"
209
+ OPENSSL_CRYPTO_LIB="$OPENSSL_LIB_DIR/libcrypto.a"
210
+ OPENSSL_SSL_LIB="$OPENSSL_LIB_DIR/libssl.a"
211
+
212
+ if [ ! -f "$OPENSSL_CRYPTO_LIB" ] || [ ! -f "$OPENSSL_SSL_LIB" ]; then
213
+ echo "Error: OpenSSL static libraries not found in $OPENSSL_LIB_DIR"
214
+ exit 1
215
+ fi
216
+ if [ ! -d "$OPENSSL_INCLUDE_DIR" ]; then
217
+ echo "Error: OpenSSL include directory not found: $OPENSSL_INCLUDE_DIR"
218
+ exit 1
219
+ fi
220
+
221
+ if [ "$USE_QUICTLS" = "1" ]; then
222
+ if ! grep -q "SSL_provide_quic_data" "$OPENSSL_INCLUDE_DIR/openssl/ssl.h" 2>/dev/null; then
223
+ echo "OpenSSL headers at $OPENSSL_INCLUDE_DIR do not include QUIC APIs."
224
+ if [ -x "$SCRIPT_DIR/build-openssl.sh" ]; then
225
+ echo "Attempting to rebuild OpenSSL via build-openssl.sh..."
226
+ OPENSSL_PREFIX="$OPENSSL_PATH"
227
+ if [[ "$OPENSSL_PREFIX" == *"/$ANDROID_ABI" ]]; then
228
+ OPENSSL_PREFIX="${OPENSSL_PREFIX%/$ANDROID_ABI}"
229
+ fi
230
+ "$SCRIPT_DIR/build-openssl.sh" \
231
+ --ndk-path "$ANDROID_NDK" \
232
+ --abi "$ANDROID_ABI" \
233
+ --platform "$ANDROID_PLATFORM" \
234
+ --quictls \
235
+ --prefix "$OPENSSL_PREFIX" || {
236
+ echo "Error: OpenSSL rebuild failed."
237
+ exit 1
238
+ }
239
+ if ! grep -q "SSL_provide_quic_data" "$OPENSSL_INCLUDE_DIR/openssl/ssl.h" 2>/dev/null; then
240
+ echo "Error: OpenSSL headers at $OPENSSL_INCLUDE_DIR still do not include QUIC APIs."
241
+ echo "Ensure OPENSSL_SOURCE_DIR points to a quictls checkout."
242
+ exit 1
243
+ fi
244
+ else
245
+ echo "Error: OpenSSL headers at $OPENSSL_INCLUDE_DIR do not include QUIC APIs."
246
+ echo "Rebuild OpenSSL with --quictls and ensure OPENSSL_SOURCE_DIR points to quictls."
247
+ exit 1
248
+ fi
249
+ fi
250
+ fi
251
+
252
+ CMAKE_ARGS+=(
253
+ -DENABLE_OPENSSL=ON
254
+ -DOPENSSL_ROOT_DIR="$OPENSSL_PATH"
255
+ -DOPENSSL_INCLUDE_DIR="$OPENSSL_INCLUDE_DIR"
256
+ -DOPENSSL_CRYPTO_LIBRARY="$OPENSSL_CRYPTO_LIB"
257
+ -DOPENSSL_SSL_LIBRARY="$OPENSSL_SSL_LIB"
258
+ -DOPENSSL_LIBRARIES="$OPENSSL_SSL_LIB;$OPENSSL_CRYPTO_LIB"
259
+ )
260
+
261
+ if [ "$USE_QUICTLS" = "1" ]; then
262
+ CMAKE_ARGS+=(
263
+ -DENABLE_QUICTLS=ON
264
+ -DHAVE_SSL_PROVIDE_QUIC_DATA=1
265
+ -DHAVE_SSL_SET_QUIC_TLS_CBS=0
266
+ )
267
+ fi
268
+ else
269
+ CMAKE_ARGS+=(
270
+ -DENABLE_OPENSSL=OFF
271
+ )
272
+ fi
273
+
274
+ echo ""
275
+ echo "Configuring CMake..."
276
+ cmake "$NGTCP2_SOURCE_DIR" "${CMAKE_ARGS[@]}"
277
+
278
+ echo ""
279
+ echo "Building ngtcp2..."
280
+ cmake --build . --config "$BUILD_TYPE" -j$(nproc 2>/dev/null || sysctl -n hw.ncpu)
281
+
282
+ echo ""
283
+ echo "Installing..."
284
+ cmake --install .
285
+
286
+ echo ""
287
+ echo "Build complete!"
288
+ echo "Library: $INSTALL_PREFIX/lib/libngtcp2.a"
289
+ echo "Headers: $INSTALL_PREFIX/include"