@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.
- package/README.md +399 -0
- package/android/NGTCP2_BUILD_INSTRUCTIONS.md +319 -0
- package/android/build-nghttp3.sh +182 -0
- package/android/build-ngtcp2.sh +289 -0
- package/android/build-openssl.sh +302 -0
- package/android/build.gradle +75 -0
- package/android/gradle.properties +3 -0
- package/android/proguard-rules.pro +2 -0
- package/android/settings.gradle +1 -0
- package/android/src/main/AndroidManifest.xml +1 -0
- package/android/src/main/assets/mqttquic_ca.pem +5 -0
- package/android/src/main/cpp/CMakeLists.txt +157 -0
- package/android/src/main/cpp/ngtcp2_jni.cpp +928 -0
- package/android/src/main/kotlin/ai/annadata/mqttquic/MqttQuicPlugin.kt +232 -0
- package/android/src/main/kotlin/ai/annadata/mqttquic/client/MQTTClient.kt +339 -0
- package/android/src/main/kotlin/ai/annadata/mqttquic/mqtt/MQTT5Properties.kt +250 -0
- package/android/src/main/kotlin/ai/annadata/mqttquic/mqtt/MQTT5Protocol.kt +281 -0
- package/android/src/main/kotlin/ai/annadata/mqttquic/mqtt/MQTT5ReasonCodes.kt +109 -0
- package/android/src/main/kotlin/ai/annadata/mqttquic/mqtt/MQTTProtocol.kt +249 -0
- package/android/src/main/kotlin/ai/annadata/mqttquic/mqtt/MQTTTypes.kt +47 -0
- package/android/src/main/kotlin/ai/annadata/mqttquic/quic/NGTCP2Client.kt +184 -0
- package/android/src/main/kotlin/ai/annadata/mqttquic/quic/QuicClientStub.kt +54 -0
- package/android/src/main/kotlin/ai/annadata/mqttquic/quic/QuicTypes.kt +21 -0
- package/android/src/main/kotlin/ai/annadata/mqttquic/transport/QUICStreamAdapter.kt +37 -0
- package/android/src/main/kotlin/ai/annadata/mqttquic/transport/StreamTransport.kt +91 -0
- package/android/src/test/kotlin/ai/annadata/mqttquic/mqtt/MQTTProtocolTest.kt +92 -0
- package/dist/esm/definitions.d.ts +66 -0
- package/dist/esm/definitions.d.ts.map +1 -0
- package/dist/esm/definitions.js +2 -0
- package/dist/esm/definitions.js.map +1 -0
- package/dist/esm/index.d.ts +5 -0
- package/dist/esm/index.d.ts.map +1 -0
- package/dist/esm/index.js +7 -0
- package/dist/esm/index.js.map +1 -0
- package/dist/esm/web.d.ts +28 -0
- package/dist/esm/web.d.ts.map +1 -0
- package/dist/esm/web.js +183 -0
- package/dist/esm/web.js.map +1 -0
- package/dist/plugin.cjs.js +217 -0
- package/dist/plugin.cjs.js.map +1 -0
- package/dist/plugin.js +215 -0
- package/dist/plugin.js.map +1 -0
- package/ios/MqttQuicPlugin.podspec +34 -0
- package/ios/NGTCP2_BUILD_INSTRUCTIONS.md +302 -0
- package/ios/Sources/MqttQuicPlugin/Client/MQTTClient.swift +343 -0
- package/ios/Sources/MqttQuicPlugin/MQTT/MQTT5Properties.swift +280 -0
- package/ios/Sources/MqttQuicPlugin/MQTT/MQTT5Protocol.swift +333 -0
- package/ios/Sources/MqttQuicPlugin/MQTT/MQTT5ReasonCodes.swift +113 -0
- package/ios/Sources/MqttQuicPlugin/MQTT/MQTTProtocol.swift +322 -0
- package/ios/Sources/MqttQuicPlugin/MQTT/MQTTTypes.swift +54 -0
- package/ios/Sources/MqttQuicPlugin/MqttQuicPlugin.swift +229 -0
- package/ios/Sources/MqttQuicPlugin/QUIC/NGTCP2Bridge.h +29 -0
- package/ios/Sources/MqttQuicPlugin/QUIC/NGTCP2Bridge.mm +865 -0
- package/ios/Sources/MqttQuicPlugin/QUIC/NGTCP2Client.swift +262 -0
- package/ios/Sources/MqttQuicPlugin/QUIC/QuicClientStub.swift +66 -0
- package/ios/Sources/MqttQuicPlugin/QUIC/QuicTypes.swift +23 -0
- package/ios/Sources/MqttQuicPlugin/Resources/mqttquic_ca.pem +5 -0
- package/ios/Sources/MqttQuicPlugin/Transport/QUICStreamAdapter.swift +50 -0
- package/ios/Sources/MqttQuicPlugin/Transport/StreamTransport.swift +105 -0
- package/ios/Tests/MQTTProtocolTests.swift +82 -0
- package/ios/build-nghttp3.sh +173 -0
- package/ios/build-ngtcp2.sh +278 -0
- package/ios/build-openssl.sh +405 -0
- 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 @@
|
|
|
1
|
+
rootProject.name = 'capacitor-mqtt-quic'
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
<manifest xmlns:android="http://schemas.android.com/apk/res/android" />
|
|
@@ -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
|
+
)
|