From 7f80c7bbafc54e0eaf32d99501be8fa7d8734fb2 Mon Sep 17 00:00:00 2001 From: acgist <289547414@qq.com> Date: Sat, 4 May 2024 19:22:17 +0800 Subject: [PATCH] [+] OHOS --- taoyao-client-openharmony/README.md | 496 ++++++++++++++++++ taoyao-client-openharmony/taoyao/.gitignore | 14 + .../taoyao/AppScope/app.json5 | 10 + .../resources/base/element/string.json | 8 + .../resources/base/media/app_icon.png | Bin 0 -> 6477 bytes .../taoyao/build-profile.json5 | 41 ++ .../taoyao/hvigor/hvigor-config.json5 | 16 + .../taoyao/hvigor/hvigor-wrapper.js | 1 + .../taoyao/hvigorfile.ts | 1 + taoyao-client-openharmony/taoyao/hvigorw | 48 ++ taoyao-client-openharmony/taoyao/hvigorw.bat | 64 +++ .../taoyao/media/build-profile.json5 | 20 + .../taoyao/media/hvigorfile.ts | 1 + .../taoyao/media/oh-package.json5 | 11 + .../taoyao/media/src/main/cpp/CMakeLists.txt | 53 ++ .../taoyao/media/src/main/cpp/bind.cpp | 86 +++ .../src/main/cpp/include/AudioCapturer.hpp | 5 + .../media/src/main/cpp/include/Capturer.hpp | 24 + .../media/src/main/cpp/include/Client.hpp | 19 + .../src/main/cpp/include/LocalClient.hpp | 10 + .../src/main/cpp/include/MediaManager.hpp | 32 ++ .../src/main/cpp/include/RemoteClient.hpp | 10 + .../media/src/main/cpp/include/Room.hpp | 18 + .../media/src/main/cpp/include/RoomClient.hpp | 10 + .../src/main/cpp/include/VideoCapturer.hpp | 5 + .../media/src/main/cpp/media/Client.cpp | 0 .../media/src/main/cpp/media/LocalClient.cpp | 0 .../media/src/main/cpp/media/MediaManager.cpp | 20 + .../media/src/main/cpp/media/RemoteClient.cpp | 0 .../taoyao/media/src/main/cpp/media/Room.cpp | 0 .../media/src/main/cpp/media/RoomClient.cpp | 0 .../src/main/cpp/types/libtaoyao/index.d.ts | 18 + .../main/cpp/types/libtaoyao/oh-package.json5 | 6 + .../src/main/ets/entryability/EntryAbility.ts | 33 ++ .../taoyao/media/src/main/ets/pages/Index.ets | 31 ++ .../src/main/ets/taoyao/MediaManager.ets | 0 .../media/src/main/ets/taoyao/Setting.ets | 35 ++ .../src/main/ets/taoyao/TaoyaoSignal.ets | 211 ++++++++ .../taoyao/media/src/main/module.json5 | 57 ++ .../main/resources/base/element/color.json | 8 + .../main/resources/base/element/string.json | 16 + .../src/main/resources/base/media/icon.png | Bin 0 -> 6477 bytes .../resources/base/profile/main_pages.json | 5 + .../taoyao/oh-package.json5 | 13 + 44 files changed, 1456 insertions(+) create mode 100644 taoyao-client-openharmony/README.md create mode 100644 taoyao-client-openharmony/taoyao/.gitignore create mode 100644 taoyao-client-openharmony/taoyao/AppScope/app.json5 create mode 100644 taoyao-client-openharmony/taoyao/AppScope/resources/base/element/string.json create mode 100644 taoyao-client-openharmony/taoyao/AppScope/resources/base/media/app_icon.png create mode 100644 taoyao-client-openharmony/taoyao/build-profile.json5 create mode 100644 taoyao-client-openharmony/taoyao/hvigor/hvigor-config.json5 create mode 100644 taoyao-client-openharmony/taoyao/hvigor/hvigor-wrapper.js create mode 100644 taoyao-client-openharmony/taoyao/hvigorfile.ts create mode 100644 taoyao-client-openharmony/taoyao/hvigorw create mode 100644 taoyao-client-openharmony/taoyao/hvigorw.bat create mode 100644 taoyao-client-openharmony/taoyao/media/build-profile.json5 create mode 100644 taoyao-client-openharmony/taoyao/media/hvigorfile.ts create mode 100644 taoyao-client-openharmony/taoyao/media/oh-package.json5 create mode 100644 taoyao-client-openharmony/taoyao/media/src/main/cpp/CMakeLists.txt create mode 100644 taoyao-client-openharmony/taoyao/media/src/main/cpp/bind.cpp create mode 100644 taoyao-client-openharmony/taoyao/media/src/main/cpp/include/AudioCapturer.hpp create mode 100644 taoyao-client-openharmony/taoyao/media/src/main/cpp/include/Capturer.hpp create mode 100644 taoyao-client-openharmony/taoyao/media/src/main/cpp/include/Client.hpp create mode 100644 taoyao-client-openharmony/taoyao/media/src/main/cpp/include/LocalClient.hpp create mode 100644 taoyao-client-openharmony/taoyao/media/src/main/cpp/include/MediaManager.hpp create mode 100644 taoyao-client-openharmony/taoyao/media/src/main/cpp/include/RemoteClient.hpp create mode 100644 taoyao-client-openharmony/taoyao/media/src/main/cpp/include/Room.hpp create mode 100644 taoyao-client-openharmony/taoyao/media/src/main/cpp/include/RoomClient.hpp create mode 100644 taoyao-client-openharmony/taoyao/media/src/main/cpp/include/VideoCapturer.hpp create mode 100644 taoyao-client-openharmony/taoyao/media/src/main/cpp/media/Client.cpp create mode 100644 taoyao-client-openharmony/taoyao/media/src/main/cpp/media/LocalClient.cpp create mode 100644 taoyao-client-openharmony/taoyao/media/src/main/cpp/media/MediaManager.cpp create mode 100644 taoyao-client-openharmony/taoyao/media/src/main/cpp/media/RemoteClient.cpp create mode 100644 taoyao-client-openharmony/taoyao/media/src/main/cpp/media/Room.cpp create mode 100644 taoyao-client-openharmony/taoyao/media/src/main/cpp/media/RoomClient.cpp create mode 100644 taoyao-client-openharmony/taoyao/media/src/main/cpp/types/libtaoyao/index.d.ts create mode 100644 taoyao-client-openharmony/taoyao/media/src/main/cpp/types/libtaoyao/oh-package.json5 create mode 100644 taoyao-client-openharmony/taoyao/media/src/main/ets/entryability/EntryAbility.ts create mode 100644 taoyao-client-openharmony/taoyao/media/src/main/ets/pages/Index.ets create mode 100644 taoyao-client-openharmony/taoyao/media/src/main/ets/taoyao/MediaManager.ets create mode 100644 taoyao-client-openharmony/taoyao/media/src/main/ets/taoyao/Setting.ets create mode 100644 taoyao-client-openharmony/taoyao/media/src/main/ets/taoyao/TaoyaoSignal.ets create mode 100644 taoyao-client-openharmony/taoyao/media/src/main/module.json5 create mode 100644 taoyao-client-openharmony/taoyao/media/src/main/resources/base/element/color.json create mode 100644 taoyao-client-openharmony/taoyao/media/src/main/resources/base/element/string.json create mode 100644 taoyao-client-openharmony/taoyao/media/src/main/resources/base/media/icon.png create mode 100644 taoyao-client-openharmony/taoyao/media/src/main/resources/base/profile/main_pages.json create mode 100644 taoyao-client-openharmony/taoyao/oh-package.json5 diff --git a/taoyao-client-openharmony/README.md b/taoyao-client-openharmony/README.md new file mode 100644 index 0000000..9425f2b --- /dev/null +++ b/taoyao-client-openharmony/README.md @@ -0,0 +1,496 @@ +# 桃夭终端 + +## 支持版本 + +* SDK 9 + +## C++终端 + +* [libmediasoupclient源码](https://github.com/versatica/libmediasoupclient) +* [libmediasoupclient文档](https://mediasoup.org/documentation/v3/libmediasoupclient) +* [libmediasoupclient接口](https://mediasoup.org/documentation/v3/libmediasoupclient/api) + +## 项目配置 + +* https://gitee.com/openharmony-sig/ohos_webrtc/blob/master/doc/webrtc_build.md + +``` +# WebRTC版本:m114 +# libmediasoupclient版本:m120 + +gn gen ./out/ohos_webrtc --args='target_os="ohos" target_cpu="arm64" is_clang=true is_debug=false use_rtti=true rtc_use_h264=true use_custom_libcxx=false rtc_include_tests=false is_component_build=false treat_warnings_as_errors=false rtc_build_examples=false libyuv_include_tests=false rtc_use_dummy_audio_file_devices=true ohos_sdk_native_root="/data/dev/ohos-sdk/linux/native"' + +ninja -C ./out/ohos_webrtc -j 32 +``` + +## openharmony-sig/ohos_webrtc + +* https://gitee.com/openharmony-sig/ohos_webrtc +* https://gitee.com/openharmony-sig/ohos_webrtc/tree/master/doc + +## openharmony-tpc/chromium_third_party_webrtc + +* https://gitee.com/openharmony-tpc +* https://gitee.com/openharmony-tpc/chromium_third_party_webrtc +* https://gitee.com/openharmony-tpc/chromium_third_party_ohos_prebuilts + +## Linux(鸿蒙) + +``` +# 编译工具 +mkdir -p /data +cd /data +git clone https://chromium.googlesource.com/chromium/tools/depot_tools.git + +# 下载源码 +mkdir -p /data/webrtc +cd /data/webrtc +/data/depot_tools/fetch --nohooks webrtc +#/data/depot_tools/gclient sync + +# 切换分支 +cd src +git checkout -b m94 branch-heads/4606 +/data/depot_tools/gclient sync + +# 编译依赖 +./build/install-build-deps.sh + +# 鸿蒙工具 +wget https://repo.huaweicloud.com/openharmony/os/4.0-Release/ohos-sdk-windows_linux-public.tar.gz + +# 编译项目 +./buildtools/linux64/gn gen out/Release-clang-x64 --args='target_os="linux" target_cpu="x64" is_clang=true is_debug=false use_rtti=true rtc_use_h264=true use_custom_libcxx=true rtc_include_tests=false is_component_build=false treat_warnings_as_errors=false rtc_build_examples=false' +./third_party/depot_tools/ninja -C out/Release-clang-x64 + +./buildtools/linux64/gn gen out/Release-clang-x86 --args='target_os="linux" target_cpu="x86" is_clang=true is_debug=false use_rtti=true rtc_use_h264=true use_custom_libcxx=true rtc_include_tests=false is_component_build=false treat_warnings_as_errors=false rtc_build_examples=false' +./third_party/depot_tools/ninja -C out/Release-clang-x86 + +./build/linux/sysroot_scripts/install-sysroot.py --arch=arm +./buildtools/linux64/gn gen out/Release-clang-arm --args='target_os="linux" target_cpu="arm" is_clang=true is_debug=false use_rtti=true rtc_use_h264=true use_custom_libcxx=true rtc_include_tests=false is_component_build=false treat_warnings_as_errors=false rtc_build_examples=false' +./third_party/depot_tools/ninja -C out/Release-clang-arm + +./build/linux/sysroot_scripts/install-sysroot.py --arch=arm64 +./buildtools/linux64/gn gen out/Release-clang-arm64 --args='target_os="linux" target_cpu="arm64" is_clang=true is_debug=false use_rtti=true rtc_use_h264=true use_custom_libcxx=true rtc_include_tests=false is_component_build=false treat_warnings_as_errors=false rtc_build_examples=false' +./third_party/depot_tools/ninja -C out/Release-clang-arm64 +``` + +# 国产 + +> https://blog.csdn.net/oqqKuKu12/article/details/136029483 + +## aarch64 + +``` +# 安装交叉编译工具链 +sudo apt-get install binutils-aarch64-linux-gnu +sudo apt-get install gcc-7-aarch64-linux-gnu +sudo apt-get install g++-7-aarch64-linux-gnu +cd /usr/bin +sudo ln -s aarch64-linux-gnu-gcc-7 aarch64-linux-gnu-gcc +sudo ln -s aarch64-linux-gnu-g++-7 aarch64-linux-gnu-g++ + +# 源码安装交叉工具依赖库 +cd webrtc/build/linux/sysroot_scripts +./install-sysroot.py --arch=arm64 + +# 交叉编译 +gn gen out/Release-aarch64 --args=' + target_os="linux" + target_cpu="arm64" + is_clang=false + is_debug=false + use_rtti=true + rtc_use_h264=true + use_custom_libcxx=false + rtc_include_tests=false + is_component_build=false + treat_warnings_as_errors=false + rtc_build_examples=false + symbol_level=0 + rtc_use_x11=true + rtc_build_ssl=true + rtc_build_tools=false + rtc_use_pipewire=true + rtc_enable_protobuf=false + rtc_include_pulse_audio=false + ffmpeg_branding="Chrome" + proprietary_codecs=true + use_partition_alloc=false + ' + +ninja -C out/Release-aarch64 +``` + +## mips64el + +``` +# 安装交叉编译工具链 +sudo apt-get install binutils-mips64el-linux-gnu +sudo apt-get install gcc-7-mips64el-linux-gnu +sudo apt-get install g++-7-mips64el-linux-gnu +cd /usr/bin +sudo ln -s mips64el-linux-gnu-gcc-7 mips64el-linux-gnu-gcc +sudo ln -s mips64el-linux-gnu-g++-7 mips64el-linux-gnu-g++ + +# 源码安装交叉工具依赖库 +cd webrtc/build/linux/sysroot_scripts +./install-sysroot.py --arch=mips64el + +# 交叉编译 +gn gen out/Release-mips64el --args=' + target_os="linux" + target_cpu="mips64el" + is_clang=false + is_debug=false + use_rtti=true + rtc_use_h264=true + use_custom_libcxx=false + rtc_include_tests=false + is_component_build=false + treat_warnings_as_errors=false + rtc_build_examples=false + symbol_level=0 + rtc_use_x11=true + rtc_build_ssl=true + rtc_build_tools=false + rtc_use_pipewire=true + rtc_enable_protobuf=false + ffmpeg_branding="Chrome" + proprietary_codecs=true + use_partition_alloc=false + ' + +ninja -C out/Release-mips64el +``` + +## loongarch64 + +``` +# 安装交叉编译工具链 +cd /opt/cross_compile/loongarch64 +wget http://ftp.loongnix.cn/toolchain/gcc/release/loongarch/gcc8/loongson-gnu-toolchain-8.3-x86_64-loongarch64-linux-gnu-rc1.2.tar.xz +xz loongson-gnu-toolchain-8.3-x86_64-loongarch64-linux-gnu-rc1.2.tar.xz + +# 配置WebRTC添加平台支持 +cd build/toolchain/linux +vim BUILD.gn +gcc_toolchain("loongarch64") { + toolprefix = "loongarch64-linux-gnu-" + cc = "${toolprefix}gcc -w" + cxx= "${toolprefix}g++ -w" + ar = "${toolprefix}ar" + ld = cxx + readelf = "${toolprefix}readelf" + nm = "${toolprefix}nm" + + toolchain_args = { + cc_wrapper = "" + current_cpu = "loongarch64" + current_os = "linux" + is_clang = false + use_goma = false + } +} + +# 配置环境和sysroot +vim ~/.profile +export PATH=$PATH:/opt/cross_compile/loongarch64/usr/bin +export SYSROOT="/opt/cross_compile/loongarch64/usr/sysroot" +export CPATH=$CPATH:${SYSROOT}/usr/include:${SYSROOT}/usr/include/glib-2.0:${SYSROOT}/usr/lib/glib-2.0/include:${SYSROOT}/usr/include/gio-unix-2.0 +. ~/.profile + + target_os="linux" + target_cpu="mips64el" + is_clang=false + is_debug=false + use_rtti=true + rtc_use_h264=true + use_custom_libcxx=false + rtc_include_tests=false + is_component_build=false + treat_warnings_as_errors=false + rtc_build_examples=false + symbol_level=0 + rtc_use_x11=true + rtc_build_ssl=true + rtc_build_tools=false + rtc_use_pipewire=true + rtc_enable_protobuf=false + ffmpeg_branding="Chrome" + proprietary_codecs=true + use_partition_alloc=false + ' + +# 交叉编译 +gn gen out/Release-loongarch64 --args=' + target_os="linux" + target_cpu="loongarch64" + is_clang=false + is_debug=false + use_rtti=true + rtc_use_h264=true + use_custom_libcxx=false + rtc_include_tests=false + is_component_build=false + treat_warnings_as_errors=false + rtc_build_examples=false + symbol_level=0 + rtc_use_x11=true + rtc_build_ssl=true + rtc_build_tools=false + rtc_use_pipewire=false + rtc_enable_protobuf=false + ffmpeg_branding="Chrome" + proprietary_codecs=true + use_partition_alloc=false + ' + +ninja -C out/Release-loongarch64 +``` + +# Build command for all platforms + +> https://github.com/webrtc-sdk/webrtc-build/blob/main/docs/build.md + +## iOS arm + +```bash +gn gen out/ios-arm-device --args=" + target_os = \"ios\" + ios_enable_code_signing = false + use_xcode_clang = true + is_component_build = false + target_environment = \"device\" + target_cpu = \"arm\" + ios_deployment_target = \"10.0\" + enable_ios_bitcode = false + use_goma = false + rtc_enable_symbol_export = true + rtc_libvpx_build_vp9 = true + rtc_include_tests = false + rtc_build_examples = false + rtc_use_h264 = false + rtc_enable_protobuf = false + use_rtti = true + is_debug = false + enable_dsyms = false + enable_stripping = true" + +ninja -C out/ios-arm-device ios_framework_bundle +``` + +## iOS arm64 + +```bash +gn gen out/ios-arm64-device --args=" + target_os = \"ios\" + ios_enable_code_signing = false + use_xcode_clang = true + is_component_build = false + target_environment = \"device\" + target_cpu = \"arm64\" + ios_deployment_target = \"10.0\" + enable_ios_bitcode = false + use_goma = false + rtc_enable_symbol_export = true + rtc_libvpx_build_vp9 = true + rtc_include_tests = false + rtc_build_examples = false + rtc_use_h264 = false + rtc_enable_protobuf = false + use_rtti = true + is_debug = false + enable_dsyms = false + enable_stripping = true" + +ninja -C out/ios-arm64-device ios_framework_bundle +``` + +## iOS x64 simulator + +```bash +gn gen out/ios-x64-simulator --args=" + target_os = \"ios\" + ios_enable_code_signing = false + use_xcode_clang = true + is_component_build = false + target_environment = \"simulator\" + target_cpu = \"x64\" + ios_deployment_target = \"12.0\" + rtc_libvpx_build_vp9 = true + enable_ios_bitcode = false + use_goma = false + rtc_enable_symbol_export = true + rtc_libvpx_build_vp9 = true + rtc_include_tests = false + rtc_build_examples = false + rtc_use_h264 = false + rtc_enable_protobuf = false + use_rtti = true + is_debug = false + enable_dsyms = false + enable_stripping = true" + +ninja -C out/ios-x64-simulator ios_framework_bundle +``` + +## iOS arm64 simulator + +```bash +gn gen out/ios-arm64-simulator --args=" + target_os = \"ios\" + ios_enable_code_signing = false + use_xcode_clang = true + is_component_build = false + target_environment = \"simulator\" + target_cpu = \"arm64\" + ios_deployment_target = \"12.0\" + enable_ios_bitcode = false + use_goma = false + rtc_enable_symbol_export = true + rtc_libvpx_build_vp9 = true + rtc_include_tests = false + rtc_build_examples = false + rtc_use_h264 = false + rtc_enable_protobuf = false + use_rtti = true + is_debug = false + enable_dsyms = false + enable_stripping = true" + +ninja -C out/ios-arm64-simulator ios_framework_bundle +``` + +## macOS X64 + +```bash +gn gen out/macOS-x64 --args=" + target_os=\"mac\" + target_cpu=\"x64\" + use_xcode_clang = false + mac_deployment_target=\"10.11\" + is_component_build = false + target_cpu = \"x64\" + use_goma = false + rtc_enable_symbol_export = true + rtc_libvpx_build_vp9 = true + rtc_include_tests = false + rtc_build_examples = false + rtc_use_h264 = false + rtc_enable_protobuf = false + use_rtti = true + is_debug = false + enable_dsyms = false + enable_stripping = true" + +ninja -C out/macOS-x64 mac_framework_bundle +``` + +## macOS arm64 + +```bash +gn gen out/macOS-arm64 --args=" + target_os=\"mac\" + target_cpu=\"x64\" + use_xcode_clang = false + mac_deployment_target=\"10.11\" + is_component_build = false + target_cpu = \"arm64\" + use_goma = false + rtc_enable_symbol_export = true + rtc_libvpx_build_vp9 = true + rtc_include_tests = false + rtc_build_examples = false + rtc_use_h264 = false + rtc_enable_protobuf = false + use_rtti = true + is_debug = false + enable_dsyms = false + enable_stripping = true" + +ninja -C out/macOS-arm64 mac_framework_bundle +``` + +## Create xcframework + +Merge the arm64 and x64 libraries of macOS. + +```bash +mkdir -p out/mac-x64-arm64-lib +cp -R out/macOS-x64/WebRTC.framework out/mac-x64-arm64-lib/WebRTC.framework +lipo -create -output out/mac-x64-arm64-lib/WebRTC.framework/WebRTC out/macOS-x64/WebRTC.framework/WebRTC out/macOS-arm64/WebRTC.framework/WebRTC +``` + +Merge the arm64 and arm libraries of iOS. + +```bash +mkdir -p out/ios-device-arm-arm64-lib +cp -R out/ios-arm64-device/WebRTC.framework out/ios-device-arm-arm64-lib/WebRTC.framework +lipo -create -output out/ios-device-arm-arm64-lib/WebRTC.framework/WebRTC out/ios-arm-device/WebRTC.framework/WebRTC out/ios-arm64-device/WebRTC.framework/WebRTC +``` + +Merge the arm64 and x64 libraries of iOS simulator. + +```bash +mkdir -p out/ios-simulator-arm64-x64-lib +cp -R out/ios-arm64-simulator/WebRTC.framework out/ios-simulator-arm64-x64-lib/WebRTC.framework +lipo -create -output out/ios-simulator-arm64-x64-lib/WebRTC.framework/WebRTC out/ios-arm64-simulator/WebRTC.framework/WebRTC out/ios-x64-simulator/WebRTC.framework/WebRTC +``` + +Create xcframework + +```bash +xcodebuild -create-xcframework \ + -framework out/ios-device-arm-arm64-lib/WebRTC.framework \ + -framework out/ios-simulator-arm64-x64-lib/WebRTC.framework \ + -framework out/mac-x64-arm64-lib/WebRTC.framework \ + -output out/WebRTC.xcframework +cp LICENSE out/WebRTC.xcframework/ +``` + +Fix symbolic links issue for macOS + +``` +cd out/WebRTC.xcframework/macos-arm64_x86_64/WebRTC.framework/ +mv WebRTC Versions/A/WebRTC +ln -s Versions/Current/WebRTC WebRTC +``` + +Create a release zip file + +``` +cd out/ +zip --symlinks -9 -r WebRTC.xcframework.zip WebRTC.xcframework +# hash +shasum -a 256 WebRTC.xcframework.zip +``` + +## Android + +```bash +vpython ./tools_webrtc/android/build_aar.py --build-dir webrtc_android --output ./webrtc_android/libwebrtc.aar --arch armeabi-v7a arm64-v8a x86_64 x86 --extra-gn-args 'is_java_debug=false rtc_include_tests=false rtc_use_h264=false is_component_build=false use_rtti=true rtc_build_examples=false treat_warnings_as_errors=false' +``` + +## Linux + +```bash +gn gen out/Linux-x64 --args="target_os=\"linux\" target_cpu=\"x64\" is_debug=false rtc_include_tests=false rtc_use_h264=false is_component_build=false use_rtti=true use_custom_libcxx=false rtc_enable_protobuf=false" +gn gen out/Linux-x86 --args="target_os=\"linux\" target_cpu=\"x86\" is_debug=false rtc_include_tests=false rtc_use_h264=false is_component_build=false use_rtti=true use_custom_libcxx=false rtc_enable_protobuf=false" +``` + +## Linux ARM/ARM64 + +```bash +gn gen out/Linux-arm --args="target_os=\"linux\" target_cpu=\"arm\" is_debug=false rtc_include_tests=false rtc_use_h264=false is_component_build=false use_rtti=true use_custom_libcxx=false rtc_enable_protobuf=false" +gn gen out/Linux-arm64 --args="target_os=\"linux\" target_cpu=\"arm64\" is_debug=false rtc_include_tests=false rtc_use_h264=false is_component_build=false use_rtti=true use_custom_libcxx=false rtc_enable_protobuf=false" + +``` + +## Windows + +```console +set DEPOT_TOOLS_WIN_TOOLCHAIN=0 +gn gen out/Windows-x64 --args="target_os=\"win\" target_cpu=\"x64\" is_debug=false rtc_include_tests=false rtc_use_h264=true ffmpeg_branding=\"Chrome\" is_component_build=false use_rtti=true use_custom_libcxx=false rtc_enable_protobuf=false" +gn gen out/Windows-x86 --args="target_os=\"win\" target_cpu=\"x86\" is_debug=false rtc_include_tests=false rtc_use_h264=true ffmpeg_branding=\"Chrome\" is_component_build=false use_rtti=true use_custom_libcxx=false rtc_enable_protobuf=false" +``` diff --git a/taoyao-client-openharmony/taoyao/.gitignore b/taoyao-client-openharmony/taoyao/.gitignore new file mode 100644 index 0000000..72eaace --- /dev/null +++ b/taoyao-client-openharmony/taoyao/.gitignore @@ -0,0 +1,14 @@ +.cxx +.idea +.test +.hvigor +.clangd +.clang-tidy +.clang-format +local.properties +oh-package-lock.json5 + +deps +build +oh_modules +node_modules diff --git a/taoyao-client-openharmony/taoyao/AppScope/app.json5 b/taoyao-client-openharmony/taoyao/AppScope/app.json5 new file mode 100644 index 0000000..8101b7c --- /dev/null +++ b/taoyao-client-openharmony/taoyao/AppScope/app.json5 @@ -0,0 +1,10 @@ +{ + "app": { + "icon" : "$media:app_icon", + "label" : "$string:app_name", + "vendor": "acgist", + "bundleName" : "com.acgist.taoyao", + "versionCode": 1000000, + "versionName": "1.0.0", + } +} diff --git a/taoyao-client-openharmony/taoyao/AppScope/resources/base/element/string.json b/taoyao-client-openharmony/taoyao/AppScope/resources/base/element/string.json new file mode 100644 index 0000000..6b6c1b7 --- /dev/null +++ b/taoyao-client-openharmony/taoyao/AppScope/resources/base/element/string.json @@ -0,0 +1,8 @@ +{ + "string": [ + { + "name" : "app_name", + "value": "桃夭" + } + ] +} diff --git a/taoyao-client-openharmony/taoyao/AppScope/resources/base/media/app_icon.png b/taoyao-client-openharmony/taoyao/AppScope/resources/base/media/app_icon.png new file mode 100644 index 0000000000000000000000000000000000000000..002ccf8ff5710c5f3352c68c526a320b015c8d2e GIT binary patch literal 6477 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 literal 0 HcmV?d00001 diff --git a/taoyao-client-openharmony/taoyao/build-profile.json5 b/taoyao-client-openharmony/taoyao/build-profile.json5 new file mode 100644 index 0000000..c9806b4 --- /dev/null +++ b/taoyao-client-openharmony/taoyao/build-profile.json5 @@ -0,0 +1,41 @@ +{ + "app": { + "products": [ + { + "name" : "default", + "runtimeOS" : "OpenHarmony", + "signingConfig": "default", + "compileSdkVersion" : 11, + "compatibleSdkVersion": 11 + } + ], + "signingConfigs": [ + { + "name": "default", + "material": { + "signAlg" : "SHA256withECDSA", + "keyAlias": "debugKey", + "profile" : "C:/Users/acgis/.ohos/config/openharmony/default_taoyao_RrmPaKOZ5zMCU4QlpK1kz_6UoyvfsA4RcQxqexSUJ_8=.p7b", + "certpath" : "C:/Users/acgis/.ohos/config/openharmony/default_taoyao_RrmPaKOZ5zMCU4QlpK1kz_6UoyvfsA4RcQxqexSUJ_8=.cer", + "storeFile" : "C:/Users/acgis/.ohos/config/openharmony/default_taoyao_RrmPaKOZ5zMCU4QlpK1kz_6UoyvfsA4RcQxqexSUJ_8=.p12", + "keyPassword" : "0000001B8701B2982D8D56F7049724D2E89B72966750D8E2D94B37DDF1538D9D16EB00C8D4DA39EE4C0FC7", + "storePassword": "0000001B64642A0B174393A9875F6FCDE476F4BA4682F1EF92210832926366EA9E075136DCBB6361C9D4DD" + } + } + ], + }, + "modules": [ + { + "name": "media", + "srcPath": "./media", + "targets": [ + { + "name": "default", + "applyToProducts": [ + "default" + ] + } + ] + } + ] +} diff --git a/taoyao-client-openharmony/taoyao/hvigor/hvigor-config.json5 b/taoyao-client-openharmony/taoyao/hvigor/hvigor-config.json5 new file mode 100644 index 0000000..e4e048b --- /dev/null +++ b/taoyao-client-openharmony/taoyao/hvigor/hvigor-config.json5 @@ -0,0 +1,16 @@ +{ + "hvigorVersion": "3.2.4", + "dependencies": { + "@ohos/hvigor-ohos-plugin": "3.2.4" + }, + "execution": { + // "daemon" : true, + // "analyze" : "default", + // "parallel" : true, + // "typeCheck" : false, + // "incremental": true, + }, + "logging": { + "level": "debug" + } +} \ No newline at end of file diff --git a/taoyao-client-openharmony/taoyao/hvigor/hvigor-wrapper.js b/taoyao-client-openharmony/taoyao/hvigor/hvigor-wrapper.js new file mode 100644 index 0000000..372eae8 --- /dev/null +++ b/taoyao-client-openharmony/taoyao/hvigor/hvigor-wrapper.js @@ -0,0 +1 @@ +"use strict";var u=require("path"),D=require("os"),e=require("fs"),t=require("crypto"),r=require("child_process"),n="undefined"!=typeof globalThis?globalThis:"undefined"!=typeof window?window:"undefined"!=typeof global?global:"undefined"!=typeof self?self:{},i={},C={},F=n&&n.__importDefault||function(u){return u&&u.__esModule?u:{default:u}};Object.defineProperty(C,"__esModule",{value:!0}),C.maxPathLength=C.isMac=C.isLinux=C.isWindows=void 0;const E=F(D),A="Windows_NT",o="Darwin";function a(){return E.default.type()===A}function c(){return E.default.type()===o}C.isWindows=a,C.isLinux=function(){return"Linux"===E.default.type()},C.isMac=c,C.maxPathLength=function(){return c()?1016:a()?259:4095},function(e){var t=n&&n.__createBinding||(Object.create?function(u,D,e,t){void 0===t&&(t=e);var r=Object.getOwnPropertyDescriptor(D,e);r&&!("get"in r?!D.__esModule:r.writable||r.configurable)||(r={enumerable:!0,get:function(){return D[e]}}),Object.defineProperty(u,t,r)}:function(u,D,e,t){void 0===t&&(t=e),u[t]=D[e]}),r=n&&n.__setModuleDefault||(Object.create?function(u,D){Object.defineProperty(u,"default",{enumerable:!0,value:D})}:function(u,D){u.default=D}),i=n&&n.__importStar||function(u){if(u&&u.__esModule)return u;var D={};if(null!=u)for(var e in u)"default"!==e&&Object.prototype.hasOwnProperty.call(u,e)&&t(D,u,e);return r(D,u),D};Object.defineProperty(e,"__esModule",{value:!0}),e.WORK_SPACE=e.HVIGOR_PROJECT_WRAPPER_HOME=e.HVIGOR_PROJECT_ROOT_DIR=e.HVIGOR_PROJECT_CACHES_HOME=e.HVIGOR_PNPM_STORE_PATH=e.HVIGOR_WRAPPER_PNPM_SCRIPT_PATH=e.PROJECT_CACHES=e.HVIGOR_WRAPPER_TOOLS_HOME=e.HVIGOR_USER_HOME=e.DEFAULT_PACKAGE_JSON=e.DEFAULT_HVIGOR_CONFIG_JSON_FILE_NAME=e.PNPM=e.HVIGOR=e.NPM_TOOL=e.PNPM_TOOL=e.HVIGOR_ENGINE_PACKAGE_NAME=void 0;const F=i(D),E=i(u),A=C;e.HVIGOR_ENGINE_PACKAGE_NAME="@ohos/hvigor",e.PNPM_TOOL=(0,A.isWindows)()?"pnpm.cmd":"pnpm",e.NPM_TOOL=(0,A.isWindows)()?"npm.cmd":"npm",e.HVIGOR="hvigor",e.PNPM="pnpm",e.DEFAULT_HVIGOR_CONFIG_JSON_FILE_NAME="hvigor-config.json5",e.DEFAULT_PACKAGE_JSON="package.json",e.HVIGOR_USER_HOME=E.resolve(F.homedir(),".hvigor"),e.HVIGOR_WRAPPER_TOOLS_HOME=E.resolve(e.HVIGOR_USER_HOME,"wrapper","tools"),e.PROJECT_CACHES="project_caches",e.HVIGOR_WRAPPER_PNPM_SCRIPT_PATH=E.resolve(e.HVIGOR_WRAPPER_TOOLS_HOME,"node_modules",".bin",e.PNPM_TOOL),e.HVIGOR_PNPM_STORE_PATH=E.resolve(e.HVIGOR_USER_HOME,"caches"),e.HVIGOR_PROJECT_CACHES_HOME=E.resolve(e.HVIGOR_USER_HOME,e.PROJECT_CACHES),e.HVIGOR_PROJECT_ROOT_DIR=process.cwd(),e.HVIGOR_PROJECT_WRAPPER_HOME=E.resolve(e.HVIGOR_PROJECT_ROOT_DIR,e.HVIGOR),e.WORK_SPACE="workspace"}(i);var s={},l={};Object.defineProperty(l,"__esModule",{value:!0}),l.logInfoPrintConsole=l.logErrorAndExit=void 0,l.logErrorAndExit=function(u){u instanceof Error?console.error(u.message):console.error(u),process.exit(-1)},l.logInfoPrintConsole=function(u){console.log(u)};var B=n&&n.__createBinding||(Object.create?function(u,D,e,t){void 0===t&&(t=e);var r=Object.getOwnPropertyDescriptor(D,e);r&&!("get"in r?!D.__esModule:r.writable||r.configurable)||(r={enumerable:!0,get:function(){return D[e]}}),Object.defineProperty(u,t,r)}:function(u,D,e,t){void 0===t&&(t=e),u[t]=D[e]}),d=n&&n.__setModuleDefault||(Object.create?function(u,D){Object.defineProperty(u,"default",{enumerable:!0,value:D})}:function(u,D){u.default=D}),f=n&&n.__importStar||function(u){if(u&&u.__esModule)return u;var D={};if(null!=u)for(var e in u)"default"!==e&&Object.prototype.hasOwnProperty.call(u,e)&&B(D,u,e);return d(D,u),D};Object.defineProperty(s,"__esModule",{value:!0});var _=s.executeBuild=void 0;const p=f(e),O=f(u),h=l;_=s.executeBuild=function(u){const D=O.resolve(u,"node_modules","@ohos","hvigor","bin","hvigor.js");try{const u=p.realpathSync(D);require(u)}catch(e){(0,h.logErrorAndExit)(`Error: ENOENT: no such file ${D},delete ${u} and retry.`)}};var P={},v={};!function(u){var D=n&&n.__importDefault||function(u){return u&&u.__esModule?u:{default:u}};Object.defineProperty(u,"__esModule",{value:!0}),u.hashFile=u.hash=u.createHash=void 0;const r=D(t),i=D(e);u.createHash=(u="MD5")=>r.default.createHash(u);u.hash=(D,e)=>(0,u.createHash)(e).update(D).digest("hex");u.hashFile=(D,e)=>{if(i.default.existsSync(D))return(0,u.hash)(i.default.readFileSync(D,"utf-8"),e)}}(v);var g={},m={},R={};Object.defineProperty(R,"__esModule",{value:!0}),R.Unicode=void 0;class y{}R.Unicode=y,y.SPACE_SEPARATOR=/[\u1680\u2000-\u200A\u202F\u205F\u3000]/,y.ID_START=/[\xAA\xB5\xBA\xC0-\xD6\xD8-\xF6\xF8-\u02C1\u02C6-\u02D1\u02E0-\u02E4\u02EC\u02EE\u0370-\u0374\u0376\u0377\u037A-\u037D\u037F\u0386\u0388-\u038A\u038C\u038E-\u03A1\u03A3-\u03F5\u03F7-\u0481\u048A-\u052F\u0531-\u0556\u0559\u0561-\u0587\u05D0-\u05EA\u05F0-\u05F2\u0620-\u064A\u066E\u066F\u0671-\u06D3\u06D5\u06E5\u06E6\u06EE\u06EF\u06FA-\u06FC\u06FF\u0710\u0712-\u072F\u074D-\u07A5\u07B1\u07CA-\u07EA\u07F4\u07F5\u07FA\u0800-\u0815\u081A\u0824\u0828\u0840-\u0858\u0860-\u086A\u08A0-\u08B4\u08B6-\u08BD\u0904-\u0939\u093D\u0950\u0958-\u0961\u0971-\u0980\u0985-\u098C\u098F\u0990\u0993-\u09A8\u09AA-\u09B0\u09B2\u09B6-\u09B9\u09BD\u09CE\u09DC\u09DD\u09DF-\u09E1\u09F0\u09F1\u09FC\u0A05-\u0A0A\u0A0F\u0A10\u0A13-\u0A28\u0A2A-\u0A30\u0A32\u0A33\u0A35\u0A36\u0A38\u0A39\u0A59-\u0A5C\u0A5E\u0A72-\u0A74\u0A85-\u0A8D\u0A8F-\u0A91\u0A93-\u0AA8\u0AAA-\u0AB0\u0AB2\u0AB3\u0AB5-\u0AB9\u0ABD\u0AD0\u0AE0\u0AE1\u0AF9\u0B05-\u0B0C\u0B0F\u0B10\u0B13-\u0B28\u0B2A-\u0B30\u0B32\u0B33\u0B35-\u0B39\u0B3D\u0B5C\u0B5D\u0B5F-\u0B61\u0B71\u0B83\u0B85-\u0B8A\u0B8E-\u0B90\u0B92-\u0B95\u0B99\u0B9A\u0B9C\u0B9E\u0B9F\u0BA3\u0BA4\u0BA8-\u0BAA\u0BAE-\u0BB9\u0BD0\u0C05-\u0C0C\u0C0E-\u0C10\u0C12-\u0C28\u0C2A-\u0C39\u0C3D\u0C58-\u0C5A\u0C60\u0C61\u0C80\u0C85-\u0C8C\u0C8E-\u0C90\u0C92-\u0CA8\u0CAA-\u0CB3\u0CB5-\u0CB9\u0CBD\u0CDE\u0CE0\u0CE1\u0CF1\u0CF2\u0D05-\u0D0C\u0D0E-\u0D10\u0D12-\u0D3A\u0D3D\u0D4E\u0D54-\u0D56\u0D5F-\u0D61\u0D7A-\u0D7F\u0D85-\u0D96\u0D9A-\u0DB1\u0DB3-\u0DBB\u0DBD\u0DC0-\u0DC6\u0E01-\u0E30\u0E32\u0E33\u0E40-\u0E46\u0E81\u0E82\u0E84\u0E87\u0E88\u0E8A\u0E8D\u0E94-\u0E97\u0E99-\u0E9F\u0EA1-\u0EA3\u0EA5\u0EA7\u0EAA\u0EAB\u0EAD-\u0EB0\u0EB2\u0EB3\u0EBD\u0EC0-\u0EC4\u0EC6\u0EDC-\u0EDF\u0F00\u0F40-\u0F47\u0F49-\u0F6C\u0F88-\u0F8C\u1000-\u102A\u103F\u1050-\u1055\u105A-\u105D\u1061\u1065\u1066\u106E-\u1070\u1075-\u1081\u108E\u10A0-\u10C5\u10C7\u10CD\u10D0-\u10FA\u10FC-\u1248\u124A-\u124D\u1250-\u1256\u1258\u125A-\u125D\u1260-\u1288\u128A-\u128D\u1290-\u12B0\u12B2-\u12B5\u12B8-\u12BE\u12C0\u12C2-\u12C5\u12C8-\u12D6\u12D8-\u1310\u1312-\u1315\u1318-\u135A\u1380-\u138F\u13A0-\u13F5\u13F8-\u13FD\u1401-\u166C\u166F-\u167F\u1681-\u169A\u16A0-\u16EA\u16EE-\u16F8\u1700-\u170C\u170E-\u1711\u1720-\u1731\u1740-\u1751\u1760-\u176C\u176E-\u1770\u1780-\u17B3\u17D7\u17DC\u1820-\u1877\u1880-\u1884\u1887-\u18A8\u18AA\u18B0-\u18F5\u1900-\u191E\u1950-\u196D\u1970-\u1974\u1980-\u19AB\u19B0-\u19C9\u1A00-\u1A16\u1A20-\u1A54\u1AA7\u1B05-\u1B33\u1B45-\u1B4B\u1B83-\u1BA0\u1BAE\u1BAF\u1BBA-\u1BE5\u1C00-\u1C23\u1C4D-\u1C4F\u1C5A-\u1C7D\u1C80-\u1C88\u1CE9-\u1CEC\u1CEE-\u1CF1\u1CF5\u1CF6\u1D00-\u1DBF\u1E00-\u1F15\u1F18-\u1F1D\u1F20-\u1F45\u1F48-\u1F4D\u1F50-\u1F57\u1F59\u1F5B\u1F5D\u1F5F-\u1F7D\u1F80-\u1FB4\u1FB6-\u1FBC\u1FBE\u1FC2-\u1FC4\u1FC6-\u1FCC\u1FD0-\u1FD3\u1FD6-\u1FDB\u1FE0-\u1FEC\u1FF2-\u1FF4\u1FF6-\u1FFC\u2071\u207F\u2090-\u209C\u2102\u2107\u210A-\u2113\u2115\u2119-\u211D\u2124\u2126\u2128\u212A-\u212D\u212F-\u2139\u213C-\u213F\u2145-\u2149\u214E\u2160-\u2188\u2C00-\u2C2E\u2C30-\u2C5E\u2C60-\u2CE4\u2CEB-\u2CEE\u2CF2\u2CF3\u2D00-\u2D25\u2D27\u2D2D\u2D30-\u2D67\u2D6F\u2D80-\u2D96\u2DA0-\u2DA6\u2DA8-\u2DAE\u2DB0-\u2DB6\u2DB8-\u2DBE\u2DC0-\u2DC6\u2DC8-\u2DCE\u2DD0-\u2DD6\u2DD8-\u2DDE\u2E2F\u3005-\u3007\u3021-\u3029\u3031-\u3035\u3038-\u303C\u3041-\u3096\u309D-\u309F\u30A1-\u30FA\u30FC-\u30FF\u3105-\u312E\u3131-\u318E\u31A0-\u31BA\u31F0-\u31FF\u3400-\u4DB5\u4E00-\u9FEA\uA000-\uA48C\uA4D0-\uA4FD\uA500-\uA60C\uA610-\uA61F\uA62A\uA62B\uA640-\uA66E\uA67F-\uA69D\uA6A0-\uA6EF\uA717-\uA71F\uA722-\uA788\uA78B-\uA7AE\uA7B0-\uA7B7\uA7F7-\uA801\uA803-\uA805\uA807-\uA80A\uA80C-\uA822\uA840-\uA873\uA882-\uA8B3\uA8F2-\uA8F7\uA8FB\uA8FD\uA90A-\uA925\uA930-\uA946\uA960-\uA97C\uA984-\uA9B2\uA9CF\uA9E0-\uA9E4\uA9E6-\uA9EF\uA9FA-\uA9FE\uAA00-\uAA28\uAA40-\uAA42\uAA44-\uAA4B\uAA60-\uAA76\uAA7A\uAA7E-\uAAAF\uAAB1\uAAB5\uAAB6\uAAB9-\uAABD\uAAC0\uAAC2\uAADB-\uAADD\uAAE0-\uAAEA\uAAF2-\uAAF4\uAB01-\uAB06\uAB09-\uAB0E\uAB11-\uAB16\uAB20-\uAB26\uAB28-\uAB2E\uAB30-\uAB5A\uAB5C-\uAB65\uAB70-\uABE2\uAC00-\uD7A3\uD7B0-\uD7C6\uD7CB-\uD7FB\uF900-\uFA6D\uFA70-\uFAD9\uFB00-\uFB06\uFB13-\uFB17\uFB1D\uFB1F-\uFB28\uFB2A-\uFB36\uFB38-\uFB3C\uFB3E\uFB40\uFB41\uFB43\uFB44\uFB46-\uFBB1\uFBD3-\uFD3D\uFD50-\uFD8F\uFD92-\uFDC7\uFDF0-\uFDFB\uFE70-\uFE74\uFE76-\uFEFC\uFF21-\uFF3A\uFF41-\uFF5A\uFF66-\uFFBE\uFFC2-\uFFC7\uFFCA-\uFFCF\uFFD2-\uFFD7\uFFDA-\uFFDC]|\uD800[\uDC00-\uDC0B\uDC0D-\uDC26\uDC28-\uDC3A\uDC3C\uDC3D\uDC3F-\uDC4D\uDC50-\uDC5D\uDC80-\uDCFA\uDD40-\uDD74\uDE80-\uDE9C\uDEA0-\uDED0\uDF00-\uDF1F\uDF2D-\uDF4A\uDF50-\uDF75\uDF80-\uDF9D\uDFA0-\uDFC3\uDFC8-\uDFCF\uDFD1-\uDFD5]|\uD801[\uDC00-\uDC9D\uDCB0-\uDCD3\uDCD8-\uDCFB\uDD00-\uDD27\uDD30-\uDD63\uDE00-\uDF36\uDF40-\uDF55\uDF60-\uDF67]|\uD802[\uDC00-\uDC05\uDC08\uDC0A-\uDC35\uDC37\uDC38\uDC3C\uDC3F-\uDC55\uDC60-\uDC76\uDC80-\uDC9E\uDCE0-\uDCF2\uDCF4\uDCF5\uDD00-\uDD15\uDD20-\uDD39\uDD80-\uDDB7\uDDBE\uDDBF\uDE00\uDE10-\uDE13\uDE15-\uDE17\uDE19-\uDE33\uDE60-\uDE7C\uDE80-\uDE9C\uDEC0-\uDEC7\uDEC9-\uDEE4\uDF00-\uDF35\uDF40-\uDF55\uDF60-\uDF72\uDF80-\uDF91]|\uD803[\uDC00-\uDC48\uDC80-\uDCB2\uDCC0-\uDCF2]|\uD804[\uDC03-\uDC37\uDC83-\uDCAF\uDCD0-\uDCE8\uDD03-\uDD26\uDD50-\uDD72\uDD76\uDD83-\uDDB2\uDDC1-\uDDC4\uDDDA\uDDDC\uDE00-\uDE11\uDE13-\uDE2B\uDE80-\uDE86\uDE88\uDE8A-\uDE8D\uDE8F-\uDE9D\uDE9F-\uDEA8\uDEB0-\uDEDE\uDF05-\uDF0C\uDF0F\uDF10\uDF13-\uDF28\uDF2A-\uDF30\uDF32\uDF33\uDF35-\uDF39\uDF3D\uDF50\uDF5D-\uDF61]|\uD805[\uDC00-\uDC34\uDC47-\uDC4A\uDC80-\uDCAF\uDCC4\uDCC5\uDCC7\uDD80-\uDDAE\uDDD8-\uDDDB\uDE00-\uDE2F\uDE44\uDE80-\uDEAA\uDF00-\uDF19]|\uD806[\uDCA0-\uDCDF\uDCFF\uDE00\uDE0B-\uDE32\uDE3A\uDE50\uDE5C-\uDE83\uDE86-\uDE89\uDEC0-\uDEF8]|\uD807[\uDC00-\uDC08\uDC0A-\uDC2E\uDC40\uDC72-\uDC8F\uDD00-\uDD06\uDD08\uDD09\uDD0B-\uDD30\uDD46]|\uD808[\uDC00-\uDF99]|\uD809[\uDC00-\uDC6E\uDC80-\uDD43]|[\uD80C\uD81C-\uD820\uD840-\uD868\uD86A-\uD86C\uD86F-\uD872\uD874-\uD879][\uDC00-\uDFFF]|\uD80D[\uDC00-\uDC2E]|\uD811[\uDC00-\uDE46]|\uD81A[\uDC00-\uDE38\uDE40-\uDE5E\uDED0-\uDEED\uDF00-\uDF2F\uDF40-\uDF43\uDF63-\uDF77\uDF7D-\uDF8F]|\uD81B[\uDF00-\uDF44\uDF50\uDF93-\uDF9F\uDFE0\uDFE1]|\uD821[\uDC00-\uDFEC]|\uD822[\uDC00-\uDEF2]|\uD82C[\uDC00-\uDD1E\uDD70-\uDEFB]|\uD82F[\uDC00-\uDC6A\uDC70-\uDC7C\uDC80-\uDC88\uDC90-\uDC99]|\uD835[\uDC00-\uDC54\uDC56-\uDC9C\uDC9E\uDC9F\uDCA2\uDCA5\uDCA6\uDCA9-\uDCAC\uDCAE-\uDCB9\uDCBB\uDCBD-\uDCC3\uDCC5-\uDD05\uDD07-\uDD0A\uDD0D-\uDD14\uDD16-\uDD1C\uDD1E-\uDD39\uDD3B-\uDD3E\uDD40-\uDD44\uDD46\uDD4A-\uDD50\uDD52-\uDEA5\uDEA8-\uDEC0\uDEC2-\uDEDA\uDEDC-\uDEFA\uDEFC-\uDF14\uDF16-\uDF34\uDF36-\uDF4E\uDF50-\uDF6E\uDF70-\uDF88\uDF8A-\uDFA8\uDFAA-\uDFC2\uDFC4-\uDFCB]|\uD83A[\uDC00-\uDCC4\uDD00-\uDD43]|\uD83B[\uDE00-\uDE03\uDE05-\uDE1F\uDE21\uDE22\uDE24\uDE27\uDE29-\uDE32\uDE34-\uDE37\uDE39\uDE3B\uDE42\uDE47\uDE49\uDE4B\uDE4D-\uDE4F\uDE51\uDE52\uDE54\uDE57\uDE59\uDE5B\uDE5D\uDE5F\uDE61\uDE62\uDE64\uDE67-\uDE6A\uDE6C-\uDE72\uDE74-\uDE77\uDE79-\uDE7C\uDE7E\uDE80-\uDE89\uDE8B-\uDE9B\uDEA1-\uDEA3\uDEA5-\uDEA9\uDEAB-\uDEBB]|\uD869[\uDC00-\uDED6\uDF00-\uDFFF]|\uD86D[\uDC00-\uDF34\uDF40-\uDFFF]|\uD86E[\uDC00-\uDC1D\uDC20-\uDFFF]|\uD873[\uDC00-\uDEA1\uDEB0-\uDFFF]|\uD87A[\uDC00-\uDFE0]|\uD87E[\uDC00-\uDE1D]/,y.ID_CONTINUE=/[\xAA\xB5\xBA\xC0-\xD6\xD8-\xF6\xF8-\u02C1\u02C6-\u02D1\u02E0-\u02E4\u02EC\u02EE\u0300-\u0374\u0376\u0377\u037A-\u037D\u037F\u0386\u0388-\u038A\u038C\u038E-\u03A1\u03A3-\u03F5\u03F7-\u0481\u0483-\u0487\u048A-\u052F\u0531-\u0556\u0559\u0561-\u0587\u0591-\u05BD\u05BF\u05C1\u05C2\u05C4\u05C5\u05C7\u05D0-\u05EA\u05F0-\u05F2\u0610-\u061A\u0620-\u0669\u066E-\u06D3\u06D5-\u06DC\u06DF-\u06E8\u06EA-\u06FC\u06FF\u0710-\u074A\u074D-\u07B1\u07C0-\u07F5\u07FA\u0800-\u082D\u0840-\u085B\u0860-\u086A\u08A0-\u08B4\u08B6-\u08BD\u08D4-\u08E1\u08E3-\u0963\u0966-\u096F\u0971-\u0983\u0985-\u098C\u098F\u0990\u0993-\u09A8\u09AA-\u09B0\u09B2\u09B6-\u09B9\u09BC-\u09C4\u09C7\u09C8\u09CB-\u09CE\u09D7\u09DC\u09DD\u09DF-\u09E3\u09E6-\u09F1\u09FC\u0A01-\u0A03\u0A05-\u0A0A\u0A0F\u0A10\u0A13-\u0A28\u0A2A-\u0A30\u0A32\u0A33\u0A35\u0A36\u0A38\u0A39\u0A3C\u0A3E-\u0A42\u0A47\u0A48\u0A4B-\u0A4D\u0A51\u0A59-\u0A5C\u0A5E\u0A66-\u0A75\u0A81-\u0A83\u0A85-\u0A8D\u0A8F-\u0A91\u0A93-\u0AA8\u0AAA-\u0AB0\u0AB2\u0AB3\u0AB5-\u0AB9\u0ABC-\u0AC5\u0AC7-\u0AC9\u0ACB-\u0ACD\u0AD0\u0AE0-\u0AE3\u0AE6-\u0AEF\u0AF9-\u0AFF\u0B01-\u0B03\u0B05-\u0B0C\u0B0F\u0B10\u0B13-\u0B28\u0B2A-\u0B30\u0B32\u0B33\u0B35-\u0B39\u0B3C-\u0B44\u0B47\u0B48\u0B4B-\u0B4D\u0B56\u0B57\u0B5C\u0B5D\u0B5F-\u0B63\u0B66-\u0B6F\u0B71\u0B82\u0B83\u0B85-\u0B8A\u0B8E-\u0B90\u0B92-\u0B95\u0B99\u0B9A\u0B9C\u0B9E\u0B9F\u0BA3\u0BA4\u0BA8-\u0BAA\u0BAE-\u0BB9\u0BBE-\u0BC2\u0BC6-\u0BC8\u0BCA-\u0BCD\u0BD0\u0BD7\u0BE6-\u0BEF\u0C00-\u0C03\u0C05-\u0C0C\u0C0E-\u0C10\u0C12-\u0C28\u0C2A-\u0C39\u0C3D-\u0C44\u0C46-\u0C48\u0C4A-\u0C4D\u0C55\u0C56\u0C58-\u0C5A\u0C60-\u0C63\u0C66-\u0C6F\u0C80-\u0C83\u0C85-\u0C8C\u0C8E-\u0C90\u0C92-\u0CA8\u0CAA-\u0CB3\u0CB5-\u0CB9\u0CBC-\u0CC4\u0CC6-\u0CC8\u0CCA-\u0CCD\u0CD5\u0CD6\u0CDE\u0CE0-\u0CE3\u0CE6-\u0CEF\u0CF1\u0CF2\u0D00-\u0D03\u0D05-\u0D0C\u0D0E-\u0D10\u0D12-\u0D44\u0D46-\u0D48\u0D4A-\u0D4E\u0D54-\u0D57\u0D5F-\u0D63\u0D66-\u0D6F\u0D7A-\u0D7F\u0D82\u0D83\u0D85-\u0D96\u0D9A-\u0DB1\u0DB3-\u0DBB\u0DBD\u0DC0-\u0DC6\u0DCA\u0DCF-\u0DD4\u0DD6\u0DD8-\u0DDF\u0DE6-\u0DEF\u0DF2\u0DF3\u0E01-\u0E3A\u0E40-\u0E4E\u0E50-\u0E59\u0E81\u0E82\u0E84\u0E87\u0E88\u0E8A\u0E8D\u0E94-\u0E97\u0E99-\u0E9F\u0EA1-\u0EA3\u0EA5\u0EA7\u0EAA\u0EAB\u0EAD-\u0EB9\u0EBB-\u0EBD\u0EC0-\u0EC4\u0EC6\u0EC8-\u0ECD\u0ED0-\u0ED9\u0EDC-\u0EDF\u0F00\u0F18\u0F19\u0F20-\u0F29\u0F35\u0F37\u0F39\u0F3E-\u0F47\u0F49-\u0F6C\u0F71-\u0F84\u0F86-\u0F97\u0F99-\u0FBC\u0FC6\u1000-\u1049\u1050-\u109D\u10A0-\u10C5\u10C7\u10CD\u10D0-\u10FA\u10FC-\u1248\u124A-\u124D\u1250-\u1256\u1258\u125A-\u125D\u1260-\u1288\u128A-\u128D\u1290-\u12B0\u12B2-\u12B5\u12B8-\u12BE\u12C0\u12C2-\u12C5\u12C8-\u12D6\u12D8-\u1310\u1312-\u1315\u1318-\u135A\u135D-\u135F\u1380-\u138F\u13A0-\u13F5\u13F8-\u13FD\u1401-\u166C\u166F-\u167F\u1681-\u169A\u16A0-\u16EA\u16EE-\u16F8\u1700-\u170C\u170E-\u1714\u1720-\u1734\u1740-\u1753\u1760-\u176C\u176E-\u1770\u1772\u1773\u1780-\u17D3\u17D7\u17DC\u17DD\u17E0-\u17E9\u180B-\u180D\u1810-\u1819\u1820-\u1877\u1880-\u18AA\u18B0-\u18F5\u1900-\u191E\u1920-\u192B\u1930-\u193B\u1946-\u196D\u1970-\u1974\u1980-\u19AB\u19B0-\u19C9\u19D0-\u19D9\u1A00-\u1A1B\u1A20-\u1A5E\u1A60-\u1A7C\u1A7F-\u1A89\u1A90-\u1A99\u1AA7\u1AB0-\u1ABD\u1B00-\u1B4B\u1B50-\u1B59\u1B6B-\u1B73\u1B80-\u1BF3\u1C00-\u1C37\u1C40-\u1C49\u1C4D-\u1C7D\u1C80-\u1C88\u1CD0-\u1CD2\u1CD4-\u1CF9\u1D00-\u1DF9\u1DFB-\u1F15\u1F18-\u1F1D\u1F20-\u1F45\u1F48-\u1F4D\u1F50-\u1F57\u1F59\u1F5B\u1F5D\u1F5F-\u1F7D\u1F80-\u1FB4\u1FB6-\u1FBC\u1FBE\u1FC2-\u1FC4\u1FC6-\u1FCC\u1FD0-\u1FD3\u1FD6-\u1FDB\u1FE0-\u1FEC\u1FF2-\u1FF4\u1FF6-\u1FFC\u203F\u2040\u2054\u2071\u207F\u2090-\u209C\u20D0-\u20DC\u20E1\u20E5-\u20F0\u2102\u2107\u210A-\u2113\u2115\u2119-\u211D\u2124\u2126\u2128\u212A-\u212D\u212F-\u2139\u213C-\u213F\u2145-\u2149\u214E\u2160-\u2188\u2C00-\u2C2E\u2C30-\u2C5E\u2C60-\u2CE4\u2CEB-\u2CF3\u2D00-\u2D25\u2D27\u2D2D\u2D30-\u2D67\u2D6F\u2D7F-\u2D96\u2DA0-\u2DA6\u2DA8-\u2DAE\u2DB0-\u2DB6\u2DB8-\u2DBE\u2DC0-\u2DC6\u2DC8-\u2DCE\u2DD0-\u2DD6\u2DD8-\u2DDE\u2DE0-\u2DFF\u2E2F\u3005-\u3007\u3021-\u302F\u3031-\u3035\u3038-\u303C\u3041-\u3096\u3099\u309A\u309D-\u309F\u30A1-\u30FA\u30FC-\u30FF\u3105-\u312E\u3131-\u318E\u31A0-\u31BA\u31F0-\u31FF\u3400-\u4DB5\u4E00-\u9FEA\uA000-\uA48C\uA4D0-\uA4FD\uA500-\uA60C\uA610-\uA62B\uA640-\uA66F\uA674-\uA67D\uA67F-\uA6F1\uA717-\uA71F\uA722-\uA788\uA78B-\uA7AE\uA7B0-\uA7B7\uA7F7-\uA827\uA840-\uA873\uA880-\uA8C5\uA8D0-\uA8D9\uA8E0-\uA8F7\uA8FB\uA8FD\uA900-\uA92D\uA930-\uA953\uA960-\uA97C\uA980-\uA9C0\uA9CF-\uA9D9\uA9E0-\uA9FE\uAA00-\uAA36\uAA40-\uAA4D\uAA50-\uAA59\uAA60-\uAA76\uAA7A-\uAAC2\uAADB-\uAADD\uAAE0-\uAAEF\uAAF2-\uAAF6\uAB01-\uAB06\uAB09-\uAB0E\uAB11-\uAB16\uAB20-\uAB26\uAB28-\uAB2E\uAB30-\uAB5A\uAB5C-\uAB65\uAB70-\uABEA\uABEC\uABED\uABF0-\uABF9\uAC00-\uD7A3\uD7B0-\uD7C6\uD7CB-\uD7FB\uF900-\uFA6D\uFA70-\uFAD9\uFB00-\uFB06\uFB13-\uFB17\uFB1D-\uFB28\uFB2A-\uFB36\uFB38-\uFB3C\uFB3E\uFB40\uFB41\uFB43\uFB44\uFB46-\uFBB1\uFBD3-\uFD3D\uFD50-\uFD8F\uFD92-\uFDC7\uFDF0-\uFDFB\uFE00-\uFE0F\uFE20-\uFE2F\uFE33\uFE34\uFE4D-\uFE4F\uFE70-\uFE74\uFE76-\uFEFC\uFF10-\uFF19\uFF21-\uFF3A\uFF3F\uFF41-\uFF5A\uFF66-\uFFBE\uFFC2-\uFFC7\uFFCA-\uFFCF\uFFD2-\uFFD7\uFFDA-\uFFDC]|\uD800[\uDC00-\uDC0B\uDC0D-\uDC26\uDC28-\uDC3A\uDC3C\uDC3D\uDC3F-\uDC4D\uDC50-\uDC5D\uDC80-\uDCFA\uDD40-\uDD74\uDDFD\uDE80-\uDE9C\uDEA0-\uDED0\uDEE0\uDF00-\uDF1F\uDF2D-\uDF4A\uDF50-\uDF7A\uDF80-\uDF9D\uDFA0-\uDFC3\uDFC8-\uDFCF\uDFD1-\uDFD5]|\uD801[\uDC00-\uDC9D\uDCA0-\uDCA9\uDCB0-\uDCD3\uDCD8-\uDCFB\uDD00-\uDD27\uDD30-\uDD63\uDE00-\uDF36\uDF40-\uDF55\uDF60-\uDF67]|\uD802[\uDC00-\uDC05\uDC08\uDC0A-\uDC35\uDC37\uDC38\uDC3C\uDC3F-\uDC55\uDC60-\uDC76\uDC80-\uDC9E\uDCE0-\uDCF2\uDCF4\uDCF5\uDD00-\uDD15\uDD20-\uDD39\uDD80-\uDDB7\uDDBE\uDDBF\uDE00-\uDE03\uDE05\uDE06\uDE0C-\uDE13\uDE15-\uDE17\uDE19-\uDE33\uDE38-\uDE3A\uDE3F\uDE60-\uDE7C\uDE80-\uDE9C\uDEC0-\uDEC7\uDEC9-\uDEE6\uDF00-\uDF35\uDF40-\uDF55\uDF60-\uDF72\uDF80-\uDF91]|\uD803[\uDC00-\uDC48\uDC80-\uDCB2\uDCC0-\uDCF2]|\uD804[\uDC00-\uDC46\uDC66-\uDC6F\uDC7F-\uDCBA\uDCD0-\uDCE8\uDCF0-\uDCF9\uDD00-\uDD34\uDD36-\uDD3F\uDD50-\uDD73\uDD76\uDD80-\uDDC4\uDDCA-\uDDCC\uDDD0-\uDDDA\uDDDC\uDE00-\uDE11\uDE13-\uDE37\uDE3E\uDE80-\uDE86\uDE88\uDE8A-\uDE8D\uDE8F-\uDE9D\uDE9F-\uDEA8\uDEB0-\uDEEA\uDEF0-\uDEF9\uDF00-\uDF03\uDF05-\uDF0C\uDF0F\uDF10\uDF13-\uDF28\uDF2A-\uDF30\uDF32\uDF33\uDF35-\uDF39\uDF3C-\uDF44\uDF47\uDF48\uDF4B-\uDF4D\uDF50\uDF57\uDF5D-\uDF63\uDF66-\uDF6C\uDF70-\uDF74]|\uD805[\uDC00-\uDC4A\uDC50-\uDC59\uDC80-\uDCC5\uDCC7\uDCD0-\uDCD9\uDD80-\uDDB5\uDDB8-\uDDC0\uDDD8-\uDDDD\uDE00-\uDE40\uDE44\uDE50-\uDE59\uDE80-\uDEB7\uDEC0-\uDEC9\uDF00-\uDF19\uDF1D-\uDF2B\uDF30-\uDF39]|\uD806[\uDCA0-\uDCE9\uDCFF\uDE00-\uDE3E\uDE47\uDE50-\uDE83\uDE86-\uDE99\uDEC0-\uDEF8]|\uD807[\uDC00-\uDC08\uDC0A-\uDC36\uDC38-\uDC40\uDC50-\uDC59\uDC72-\uDC8F\uDC92-\uDCA7\uDCA9-\uDCB6\uDD00-\uDD06\uDD08\uDD09\uDD0B-\uDD36\uDD3A\uDD3C\uDD3D\uDD3F-\uDD47\uDD50-\uDD59]|\uD808[\uDC00-\uDF99]|\uD809[\uDC00-\uDC6E\uDC80-\uDD43]|[\uD80C\uD81C-\uD820\uD840-\uD868\uD86A-\uD86C\uD86F-\uD872\uD874-\uD879][\uDC00-\uDFFF]|\uD80D[\uDC00-\uDC2E]|\uD811[\uDC00-\uDE46]|\uD81A[\uDC00-\uDE38\uDE40-\uDE5E\uDE60-\uDE69\uDED0-\uDEED\uDEF0-\uDEF4\uDF00-\uDF36\uDF40-\uDF43\uDF50-\uDF59\uDF63-\uDF77\uDF7D-\uDF8F]|\uD81B[\uDF00-\uDF44\uDF50-\uDF7E\uDF8F-\uDF9F\uDFE0\uDFE1]|\uD821[\uDC00-\uDFEC]|\uD822[\uDC00-\uDEF2]|\uD82C[\uDC00-\uDD1E\uDD70-\uDEFB]|\uD82F[\uDC00-\uDC6A\uDC70-\uDC7C\uDC80-\uDC88\uDC90-\uDC99\uDC9D\uDC9E]|\uD834[\uDD65-\uDD69\uDD6D-\uDD72\uDD7B-\uDD82\uDD85-\uDD8B\uDDAA-\uDDAD\uDE42-\uDE44]|\uD835[\uDC00-\uDC54\uDC56-\uDC9C\uDC9E\uDC9F\uDCA2\uDCA5\uDCA6\uDCA9-\uDCAC\uDCAE-\uDCB9\uDCBB\uDCBD-\uDCC3\uDCC5-\uDD05\uDD07-\uDD0A\uDD0D-\uDD14\uDD16-\uDD1C\uDD1E-\uDD39\uDD3B-\uDD3E\uDD40-\uDD44\uDD46\uDD4A-\uDD50\uDD52-\uDEA5\uDEA8-\uDEC0\uDEC2-\uDEDA\uDEDC-\uDEFA\uDEFC-\uDF14\uDF16-\uDF34\uDF36-\uDF4E\uDF50-\uDF6E\uDF70-\uDF88\uDF8A-\uDFA8\uDFAA-\uDFC2\uDFC4-\uDFCB\uDFCE-\uDFFF]|\uD836[\uDE00-\uDE36\uDE3B-\uDE6C\uDE75\uDE84\uDE9B-\uDE9F\uDEA1-\uDEAF]|\uD838[\uDC00-\uDC06\uDC08-\uDC18\uDC1B-\uDC21\uDC23\uDC24\uDC26-\uDC2A]|\uD83A[\uDC00-\uDCC4\uDCD0-\uDCD6\uDD00-\uDD4A\uDD50-\uDD59]|\uD83B[\uDE00-\uDE03\uDE05-\uDE1F\uDE21\uDE22\uDE24\uDE27\uDE29-\uDE32\uDE34-\uDE37\uDE39\uDE3B\uDE42\uDE47\uDE49\uDE4B\uDE4D-\uDE4F\uDE51\uDE52\uDE54\uDE57\uDE59\uDE5B\uDE5D\uDE5F\uDE61\uDE62\uDE64\uDE67-\uDE6A\uDE6C-\uDE72\uDE74-\uDE77\uDE79-\uDE7C\uDE7E\uDE80-\uDE89\uDE8B-\uDE9B\uDEA1-\uDEA3\uDEA5-\uDEA9\uDEAB-\uDEBB]|\uD869[\uDC00-\uDED6\uDF00-\uDFFF]|\uD86D[\uDC00-\uDF34\uDF40-\uDFFF]|\uD86E[\uDC00-\uDC1D\uDC20-\uDFFF]|\uD873[\uDC00-\uDEA1\uDEB0-\uDFFF]|\uD87A[\uDC00-\uDFE0]|\uD87E[\uDC00-\uDE1D]|\uDB40[\uDD00-\uDDEF]/,Object.defineProperty(m,"__esModule",{value:!0}),m.JudgeUtil=void 0;const I=R;m.JudgeUtil=class{static isIgnoreChar(u){return"string"==typeof u&&("\t"===u||"\v"===u||"\f"===u||" "===u||" "===u||"\ufeff"===u||"\n"===u||"\r"===u||"\u2028"===u||"\u2029"===u)}static isSpaceSeparator(u){return"string"==typeof u&&I.Unicode.SPACE_SEPARATOR.test(u)}static isIdStartChar(u){return"string"==typeof u&&(u>="a"&&u<="z"||u>="A"&&u<="Z"||"$"===u||"_"===u||I.Unicode.ID_START.test(u))}static isIdContinueChar(u){return"string"==typeof u&&(u>="a"&&u<="z"||u>="A"&&u<="Z"||u>="0"&&u<="9"||"$"===u||"_"===u||"‌"===u||"‍"===u||I.Unicode.ID_CONTINUE.test(u))}static isDigitWithoutZero(u){return/[1-9]/.test(u)}static isDigit(u){return"string"==typeof u&&/[0-9]/.test(u)}static isHexDigit(u){return"string"==typeof u&&/[0-9A-Fa-f]/.test(u)}};var N=n&&n.__importDefault||function(u){return u&&u.__esModule?u:{default:u}};Object.defineProperty(g,"__esModule",{value:!0}),g.parseJsonText=g.parseJsonFile=void 0;const b=N(e),S=N(D),w=N(u),H=m;var x;!function(u){u[u.Char=0]="Char",u[u.EOF=1]="EOF",u[u.Identifier=2]="Identifier"}(x||(x={}));let M,T,V,G,j,J,W="start",U=[],L=0,$=1,k=0,K=!1,z="default",q="'",Z=1;function X(u,D=!1){T=String(u),W="start",U=[],L=0,$=1,k=0,G=void 0,K=D;do{M=Q(),nu[W]()}while("eof"!==M.type);return G}function Q(){for(z="default",j="",q="'",Z=1;;){J=Y();const u=Du[z]();if(u)return u}}function Y(){if(T[L])return String.fromCodePoint(T.codePointAt(L))}function uu(){const u=Y();return"\n"===u?($++,k=0):u?k+=u.length:k++,u&&(L+=u.length),u}g.parseJsonFile=function(u,D=!1,e="utf-8"){const t=b.default.readFileSync(w.default.resolve(u),{encoding:e});try{return X(t,D)}catch(D){if(D instanceof SyntaxError){const e=D.message.split("at");if(2===e.length)throw new Error(`${e[0].trim()}${S.default.EOL}\t at ${u}:${e[1].trim()}`)}throw new Error(`${u} is not in valid JSON/JSON5 format.`)}},g.parseJsonText=X;const Du={default(){switch(J){case"/":return uu(),void(z="comment");case void 0:return uu(),eu("eof")}if(!H.JudgeUtil.isIgnoreChar(J)&&!H.JudgeUtil.isSpaceSeparator(J))return Du[W]();uu()},start(){z="value"},beforePropertyName(){switch(J){case"$":case"_":return j=uu(),void(z="identifierName");case"\\":return uu(),void(z="identifierNameStartEscape");case"}":return eu("punctuator",uu());case'"':case"'":return q=J,uu(),void(z="string")}if(H.JudgeUtil.isIdStartChar(J))return j+=uu(),void(z="identifierName");throw Eu(x.Char,uu())},afterPropertyName(){if(":"===J)return eu("punctuator",uu());throw Eu(x.Char,uu())},beforePropertyValue(){z="value"},afterPropertyValue(){switch(J){case",":case"}":return eu("punctuator",uu())}throw Eu(x.Char,uu())},beforeArrayValue(){if("]"===J)return eu("punctuator",uu());z="value"},afterArrayValue(){switch(J){case",":case"]":return eu("punctuator",uu())}throw Eu(x.Char,uu())},end(){throw Eu(x.Char,uu())},comment(){switch(J){case"*":return uu(),void(z="multiLineComment");case"/":return uu(),void(z="singleLineComment")}throw Eu(x.Char,uu())},multiLineComment(){switch(J){case"*":return uu(),void(z="multiLineCommentAsterisk");case void 0:throw Eu(x.Char,uu())}uu()},multiLineCommentAsterisk(){switch(J){case"*":return void uu();case"/":return uu(),void(z="default");case void 0:throw Eu(x.Char,uu())}uu(),z="multiLineComment"},singleLineComment(){switch(J){case"\n":case"\r":case"\u2028":case"\u2029":return uu(),void(z="default");case void 0:return uu(),eu("eof")}uu()},value(){switch(J){case"{":case"[":return eu("punctuator",uu());case"n":return uu(),tu("ull"),eu("null",null);case"t":return uu(),tu("rue"),eu("boolean",!0);case"f":return uu(),tu("alse"),eu("boolean",!1);case"-":case"+":return"-"===uu()&&(Z=-1),void(z="numerical");case".":case"0":case"I":case"N":return void(z="numerical");case'"':case"'":return q=J,uu(),j="",void(z="string")}if(void 0===J||!H.JudgeUtil.isDigitWithoutZero(J))throw Eu(x.Char,uu());z="numerical"},numerical(){switch(J){case".":return j=uu(),void(z="decimalPointLeading");case"0":return j=uu(),void(z="zero");case"I":return uu(),tu("nfinity"),eu("numeric",Z*(1/0));case"N":return uu(),tu("aN"),eu("numeric",NaN)}if(void 0!==J&&H.JudgeUtil.isDigitWithoutZero(J))return j=uu(),void(z="decimalInteger");throw Eu(x.Char,uu())},zero(){switch(J){case".":case"e":case"E":return void(z="decimal");case"x":case"X":return j+=uu(),void(z="hexadecimal")}return eu("numeric",0)},decimalInteger(){switch(J){case".":case"e":case"E":return void(z="decimal")}if(!H.JudgeUtil.isDigit(J))return eu("numeric",Z*Number(j));j+=uu()},decimal(){switch(J){case".":j+=uu(),z="decimalFraction";break;case"e":case"E":j+=uu(),z="decimalExponent"}},decimalPointLeading(){if(H.JudgeUtil.isDigit(J))return j+=uu(),void(z="decimalFraction");throw Eu(x.Char,uu())},decimalFraction(){switch(J){case"e":case"E":return j+=uu(),void(z="decimalExponent")}if(!H.JudgeUtil.isDigit(J))return eu("numeric",Z*Number(j));j+=uu()},decimalExponent(){switch(J){case"+":case"-":return j+=uu(),void(z="decimalExponentSign")}if(H.JudgeUtil.isDigit(J))return j+=uu(),void(z="decimalExponentInteger");throw Eu(x.Char,uu())},decimalExponentSign(){if(H.JudgeUtil.isDigit(J))return j+=uu(),void(z="decimalExponentInteger");throw Eu(x.Char,uu())},decimalExponentInteger(){if(!H.JudgeUtil.isDigit(J))return eu("numeric",Z*Number(j));j+=uu()},hexadecimal(){if(H.JudgeUtil.isHexDigit(J))return j+=uu(),void(z="hexadecimalInteger");throw Eu(x.Char,uu())},hexadecimalInteger(){if(!H.JudgeUtil.isHexDigit(J))return eu("numeric",Z*Number(j));j+=uu()},identifierNameStartEscape(){if("u"!==J)throw Eu(x.Char,uu());uu();const u=ru();switch(u){case"$":case"_":break;default:if(!H.JudgeUtil.isIdStartChar(u))throw Eu(x.Identifier)}j+=u,z="identifierName"},identifierName(){switch(J){case"$":case"_":case"‌":case"‍":return void(j+=uu());case"\\":return uu(),void(z="identifierNameEscape")}if(!H.JudgeUtil.isIdContinueChar(J))return eu("identifier",j);j+=uu()},identifierNameEscape(){if("u"!==J)throw Eu(x.Char,uu());uu();const u=ru();switch(u){case"$":case"_":case"‌":case"‍":break;default:if(!H.JudgeUtil.isIdContinueChar(u))throw Eu(x.Identifier)}j+=u,z="identifierName"},string(){switch(J){case"\\":return uu(),void(j+=function(){const u=Y(),D=function(){switch(Y()){case"b":return uu(),"\b";case"f":return uu(),"\f";case"n":return uu(),"\n";case"r":return uu(),"\r";case"t":return uu(),"\t";case"v":return uu(),"\v"}return}();if(D)return D;switch(u){case"0":if(uu(),H.JudgeUtil.isDigit(Y()))throw Eu(x.Char,uu());return"\0";case"x":return uu(),function(){let u="",D=Y();if(!H.JudgeUtil.isHexDigit(D))throw Eu(x.Char,uu());if(u+=uu(),D=Y(),!H.JudgeUtil.isHexDigit(D))throw Eu(x.Char,uu());return u+=uu(),String.fromCodePoint(parseInt(u,16))}();case"u":return uu(),ru();case"\n":case"\u2028":case"\u2029":return uu(),"";case"\r":return uu(),"\n"===Y()&&uu(),""}if(void 0===u||H.JudgeUtil.isDigitWithoutZero(u))throw Eu(x.Char,uu());return uu()}());case'"':case"'":if(J===q){const u=eu("string",j);return uu(),u}return void(j+=uu());case"\n":case"\r":case void 0:throw Eu(x.Char,uu());case"\u2028":case"\u2029":!function(u){console.warn(`JSON5: '${Fu(u)}' in strings is not valid ECMAScript; consider escaping.`)}(J)}j+=uu()}};function eu(u,D){return{type:u,value:D,line:$,column:k}}function tu(u){for(const D of u){if(Y()!==D)throw Eu(x.Char,uu());uu()}}function ru(){let u="",D=4;for(;D-- >0;){const D=Y();if(!H.JudgeUtil.isHexDigit(D))throw Eu(x.Char,uu());u+=uu()}return String.fromCodePoint(parseInt(u,16))}const nu={start(){if("eof"===M.type)throw Eu(x.EOF);iu()},beforePropertyName(){switch(M.type){case"identifier":case"string":return V=M.value,void(W="afterPropertyName");case"punctuator":return void Cu();case"eof":throw Eu(x.EOF)}},afterPropertyName(){if("eof"===M.type)throw Eu(x.EOF);W="beforePropertyValue"},beforePropertyValue(){if("eof"===M.type)throw Eu(x.EOF);iu()},afterPropertyValue(){if("eof"===M.type)throw Eu(x.EOF);switch(M.value){case",":return void(W="beforePropertyName");case"}":Cu()}},beforeArrayValue(){if("eof"===M.type)throw Eu(x.EOF);"punctuator"!==M.type||"]"!==M.value?iu():Cu()},afterArrayValue(){if("eof"===M.type)throw Eu(x.EOF);switch(M.value){case",":return void(W="beforeArrayValue");case"]":Cu()}},end(){}};function iu(){const u=function(){let u;switch(M.type){case"punctuator":switch(M.value){case"{":u={};break;case"[":u=[]}break;case"null":case"boolean":case"numeric":case"string":u=M.value}return u}();if(K&&"object"==typeof u&&(u._line=$,u._column=k),void 0===G)G=u;else{const D=U[U.length-1];Array.isArray(D)?K&&"object"!=typeof u?D.push({value:u,_line:$,_column:k}):D.push(u):D[V]=K&&"object"!=typeof u?{value:u,_line:$,_column:k}:u}!function(u){if(u&&"object"==typeof u)U.push(u),W=Array.isArray(u)?"beforeArrayValue":"beforePropertyName";else{const u=U[U.length-1];W=u?Array.isArray(u)?"afterArrayValue":"afterPropertyValue":"end"}}(u)}function Cu(){U.pop();const u=U[U.length-1];W=u?Array.isArray(u)?"afterArrayValue":"afterPropertyValue":"end"}function Fu(u){const D={"'":"\\'",'"':'\\"',"\\":"\\\\","\b":"\\b","\f":"\\f","\n":"\\n","\r":"\\r","\t":"\\t","\v":"\\v","\0":"\\0","\u2028":"\\u2028","\u2029":"\\u2029"};if(D[u])return D[u];if(u<" "){const D=u.charCodeAt(0).toString(16);return`\\x${`00${D}`.substring(D.length)}`}return u}function Eu(u,D){let e="";switch(u){case x.Char:e=void 0===D?`JSON5: invalid end of input at ${$}:${k}`:`JSON5: invalid character '${Fu(D)}' at ${$}:${k}`;break;case x.EOF:e=`JSON5: invalid end of input at ${$}:${k}`;break;case x.Identifier:k-=5,e=`JSON5: invalid identifier character at ${$}:${k}`}const t=new Au(e);return t.lineNumber=$,t.columnNumber=k,t}class Au extends SyntaxError{}var ou={},au=n&&n.__createBinding||(Object.create?function(u,D,e,t){void 0===t&&(t=e);var r=Object.getOwnPropertyDescriptor(D,e);r&&!("get"in r?!D.__esModule:r.writable||r.configurable)||(r={enumerable:!0,get:function(){return D[e]}}),Object.defineProperty(u,t,r)}:function(u,D,e,t){void 0===t&&(t=e),u[t]=D[e]}),cu=n&&n.__setModuleDefault||(Object.create?function(u,D){Object.defineProperty(u,"default",{enumerable:!0,value:D})}:function(u,D){u.default=D}),su=n&&n.__importStar||function(u){if(u&&u.__esModule)return u;var D={};if(null!=u)for(var e in u)"default"!==e&&Object.prototype.hasOwnProperty.call(u,e)&&au(D,u,e);return cu(D,u),D},lu=n&&n.__importDefault||function(u){return u&&u.__esModule?u:{default:u}};Object.defineProperty(ou,"__esModule",{value:!0}),ou.isFileExists=ou.offlinePluginConversion=ou.executeCommand=ou.getNpmPath=ou.hasNpmPackInPaths=void 0;const Bu=r,du=lu(e),fu=su(u),_u=i,pu=l;ou.hasNpmPackInPaths=function(u,D){try{return require.resolve(u,{paths:[...D]}),!0}catch(u){return!1}},ou.getNpmPath=function(){const u=process.execPath;return fu.join(fu.dirname(u),_u.NPM_TOOL)},ou.executeCommand=function(u,D,e){0!==(0,Bu.spawnSync)(u,D,e).status&&(0,pu.logErrorAndExit)(`Error: ${u} ${D} execute failed.See above for details.`)},ou.offlinePluginConversion=function(u,D){return D.startsWith("file:")||D.endsWith(".tgz")?fu.resolve(u,_u.HVIGOR,D.replace("file:","")):D},ou.isFileExists=function(u){return du.default.existsSync(u)&&du.default.statSync(u).isFile()};var Ou=n&&n.__createBinding||(Object.create?function(u,D,e,t){void 0===t&&(t=e);var r=Object.getOwnPropertyDescriptor(D,e);r&&!("get"in r?!D.__esModule:r.writable||r.configurable)||(r={enumerable:!0,get:function(){return D[e]}}),Object.defineProperty(u,t,r)}:function(u,D,e,t){void 0===t&&(t=e),u[t]=D[e]}),hu=n&&n.__setModuleDefault||(Object.create?function(u,D){Object.defineProperty(u,"default",{enumerable:!0,value:D})}:function(u,D){u.default=D}),Pu=n&&n.__importStar||function(u){if(u&&u.__esModule)return u;var D={};if(null!=u)for(var e in u)"default"!==e&&Object.prototype.hasOwnProperty.call(u,e)&&Ou(D,u,e);return hu(D,u),D},vu=n&&n.__importDefault||function(u){return u&&u.__esModule?u:{default:u}};Object.defineProperty(P,"__esModule",{value:!0});var gu=P.initProjectWorkSpace=void 0;const mu=Pu(e),Ru=vu(D),yu=Pu(u),Iu=v,Nu=i,bu=g,Su=l,wu=ou;let Hu,xu,Mu;function Tu(u,D,e){return void 0!==e.dependencies&&(0,wu.offlinePluginConversion)(Nu.HVIGOR_PROJECT_ROOT_DIR,D.dependencies[u])===yu.normalize(e.dependencies[u])}function Vu(){const u=yu.join(Mu,Nu.WORK_SPACE);if((0,Su.logInfoPrintConsole)("Hvigor cleaning..."),!mu.existsSync(u))return;const D=mu.readdirSync(u);if(!D||0===D.length)return;const e=yu.resolve(Mu,"node_modules","@ohos","hvigor","bin","hvigor.js");mu.existsSync(e)&&(0,wu.executeCommand)(process.argv[0],[e,"--stop-daemon"],{});try{D.forEach((D=>{mu.rmSync(yu.resolve(u,D),{recursive:!0})}))}catch(D){(0,Su.logErrorAndExit)(`The hvigor build tool cannot be installed. Please manually clear the workspace directory and synchronize the project again.\n\n Workspace Path: ${u}.`)}}gu=P.initProjectWorkSpace=function(){if(Hu=function(){const u=yu.resolve(Nu.HVIGOR_PROJECT_WRAPPER_HOME,Nu.DEFAULT_HVIGOR_CONFIG_JSON_FILE_NAME);mu.existsSync(u)||(0,Su.logErrorAndExit)(`Error: Hvigor config file ${u} does not exist.`);return(0,bu.parseJsonFile)(u)}(),Mu=function(u){let D;D=function(u){let D=u.hvigorVersion;if(D.startsWith("file:")||D.endsWith(".tgz"))return!1;const e=u.dependencies,t=Object.getOwnPropertyNames(e);for(const u of t){const D=e[u];if(D.startsWith("file:")||D.endsWith(".tgz"))return!1}if(1===t.length&&"@ohos/hvigor-ohos-plugin"===t[0])return D>"2.5.0";return!1}(u)?function(u){let D=`${Nu.HVIGOR_ENGINE_PACKAGE_NAME}@${u.hvigorVersion}`;const e=u.dependencies;if(e){Object.getOwnPropertyNames(e).sort().forEach((u=>{D+=`,${u}@${e[u]}`}))}return(0,Iu.hash)(D)}(u):(0,Iu.hash)(process.cwd());return yu.resolve(Ru.default.homedir(),".hvigor","project_caches",D)}(Hu),xu=function(){const u=yu.resolve(Mu,Nu.WORK_SPACE,Nu.DEFAULT_PACKAGE_JSON);return mu.existsSync(u)?(0,bu.parseJsonFile)(u):{dependencies:{}}}(),!(0,wu.hasNpmPackInPaths)(Nu.HVIGOR_ENGINE_PACKAGE_NAME,[yu.join(Mu,Nu.WORK_SPACE)])||(0,wu.offlinePluginConversion)(Nu.HVIGOR_PROJECT_ROOT_DIR,Hu.hvigorVersion)!==xu.dependencies[Nu.HVIGOR_ENGINE_PACKAGE_NAME]||!function(){function u(u){const D=null==u?void 0:u.dependencies;return void 0===D?0:Object.getOwnPropertyNames(D).length}const D=u(Hu),e=u(xu);if(D+1!==e)return!1;for(const u in null==Hu?void 0:Hu.dependencies)if(!(0,wu.hasNpmPackInPaths)(u,[yu.join(Mu,Nu.WORK_SPACE)])||!Tu(u,Hu,xu))return!1;return!0}()){Vu();try{!function(){(0,Su.logInfoPrintConsole)("Hvigor installing...");for(const u in Hu.dependencies)Hu.dependencies[u]&&(Hu.dependencies[u]=(0,wu.offlinePluginConversion)(Nu.HVIGOR_PROJECT_ROOT_DIR,Hu.dependencies[u]));const u={dependencies:{...Hu.dependencies}};u.dependencies[Nu.HVIGOR_ENGINE_PACKAGE_NAME]=(0,wu.offlinePluginConversion)(Nu.HVIGOR_PROJECT_ROOT_DIR,Hu.hvigorVersion);const D=yu.join(Mu,Nu.WORK_SPACE);try{mu.mkdirSync(D,{recursive:!0});const e=yu.resolve(D,Nu.DEFAULT_PACKAGE_JSON);mu.writeFileSync(e,JSON.stringify(u))}catch(u){(0,Su.logErrorAndExit)(u)}(function(){const u=["config","set","store-dir",Nu.HVIGOR_PNPM_STORE_PATH],D={cwd:yu.join(Mu,Nu.WORK_SPACE),stdio:["inherit","inherit","inherit"]};(0,wu.executeCommand)(Nu.HVIGOR_WRAPPER_PNPM_SCRIPT_PATH,u,D)})(),function(){const u=["install"],D={cwd:yu.join(Mu,Nu.WORK_SPACE),stdio:["inherit","inherit","inherit"]};(0,wu.executeCommand)(Nu.HVIGOR_WRAPPER_PNPM_SCRIPT_PATH,u,D)}(),(0,Su.logInfoPrintConsole)("Hvigor install success.")}()}catch(u){Vu()}}return Mu};var Gu={};!function(t){var C=n&&n.__createBinding||(Object.create?function(u,D,e,t){void 0===t&&(t=e);var r=Object.getOwnPropertyDescriptor(D,e);r&&!("get"in r?!D.__esModule:r.writable||r.configurable)||(r={enumerable:!0,get:function(){return D[e]}}),Object.defineProperty(u,t,r)}:function(u,D,e,t){void 0===t&&(t=e),u[t]=D[e]}),F=n&&n.__setModuleDefault||(Object.create?function(u,D){Object.defineProperty(u,"default",{enumerable:!0,value:D})}:function(u,D){u.default=D}),E=n&&n.__importStar||function(u){if(u&&u.__esModule)return u;var D={};if(null!=u)for(var e in u)"default"!==e&&Object.prototype.hasOwnProperty.call(u,e)&&C(D,u,e);return F(D,u),D},A=n&&n.__importDefault||function(u){return u&&u.__esModule?u:{default:u}};Object.defineProperty(t,"__esModule",{value:!0}),t.executeInstallPnpm=t.isPnpmInstalled=t.environmentHandler=t.checkNpmConifg=t.PNPM_VERSION=void 0;const o=r,a=E(e),c=A(D),s=E(u),B=i,d=l,f=ou;t.PNPM_VERSION="7.30.0",t.checkNpmConifg=function(){const u=s.resolve(B.HVIGOR_PROJECT_ROOT_DIR,".npmrc"),D=s.resolve(c.default.homedir(),".npmrc");if((0,f.isFileExists)(u)||(0,f.isFileExists)(D))return;const e=(0,f.getNpmPath)(),t=(0,o.spawnSync)(e,["config","get","prefix"],{cwd:B.HVIGOR_PROJECT_ROOT_DIR});if(0!==t.status||!t.stdout)return void(0,d.logErrorAndExit)("Error: The hvigor depends on the npmrc file. Configure the npmrc file first.");const r=s.resolve(`${t.stdout}`.replace(/[\r\n]/gi,""),".npmrc");(0,f.isFileExists)(r)||(0,d.logErrorAndExit)("Error: The hvigor depends on the npmrc file. Configure the npmrc file first.")},t.environmentHandler=function(){process.env["npm_config_update-notifier"]="false"},t.isPnpmInstalled=function(){return!!a.existsSync(B.HVIGOR_WRAPPER_PNPM_SCRIPT_PATH)&&(0,f.hasNpmPackInPaths)("pnpm",[B.HVIGOR_WRAPPER_TOOLS_HOME])},t.executeInstallPnpm=function(){(0,d.logInfoPrintConsole)(`Installing pnpm@${t.PNPM_VERSION}...`);const u=(0,f.getNpmPath)();!function(){const u=s.resolve(B.HVIGOR_WRAPPER_TOOLS_HOME,B.DEFAULT_PACKAGE_JSON);try{a.existsSync(B.HVIGOR_WRAPPER_TOOLS_HOME)||a.mkdirSync(B.HVIGOR_WRAPPER_TOOLS_HOME,{recursive:!0});const D={dependencies:{}};D.dependencies[B.PNPM]=t.PNPM_VERSION,a.writeFileSync(u,JSON.stringify(D))}catch(D){(0,d.logErrorAndExit)(`Error: EPERM: operation not permitted,create ${u} failed.`)}}(),(0,f.executeCommand)(u,["install","pnpm"],{cwd:B.HVIGOR_WRAPPER_TOOLS_HOME,stdio:["inherit","inherit","inherit"],env:process.env}),(0,d.logInfoPrintConsole)("Pnpm install success.")}}(Gu),function(){Gu.checkNpmConifg(),Gu.environmentHandler(),Gu.isPnpmInstalled()||Gu.executeInstallPnpm();const D=gu();_(u.join(D,i.WORK_SPACE))}(); \ No newline at end of file diff --git a/taoyao-client-openharmony/taoyao/hvigorfile.ts b/taoyao-client-openharmony/taoyao/hvigorfile.ts new file mode 100644 index 0000000..9917020 --- /dev/null +++ b/taoyao-client-openharmony/taoyao/hvigorfile.ts @@ -0,0 +1 @@ +export { appTasks } from '@ohos/hvigor-ohos-plugin'; \ No newline at end of file diff --git a/taoyao-client-openharmony/taoyao/hvigorw b/taoyao-client-openharmony/taoyao/hvigorw new file mode 100644 index 0000000..54aadd2 --- /dev/null +++ b/taoyao-client-openharmony/taoyao/hvigorw @@ -0,0 +1,48 @@ +#!/bin/bash + +# ---------------------------------------------------------------------------- +# Hvigor startup script, version 1.0.0 +# +# Required ENV vars: +# ------------------ +# NODE_HOME - location of a Node home dir +# or +# Add /usr/local/nodejs/bin to the PATH environment variable +# ---------------------------------------------------------------------------- + +HVIGOR_APP_HOME=$(dirname $(readlink -f $0)) +HVIGOR_WRAPPER_SCRIPT=${HVIGOR_APP_HOME}/hvigor/hvigor-wrapper.js +warn() { + echo "" + echo -e "\033[1;33m`date '+[%Y-%m-%d %H:%M:%S]'`$@\033[0m" +} + +error() { + echo "" + echo -e "\033[1;31m`date '+[%Y-%m-%d %H:%M:%S]'`$@\033[0m" +} + +fail() { + error "$@" + exit 1 +} + +# Determine node to start hvigor wrapper script +if [ -n "${NODE_HOME}" ];then + EXECUTABLE_NODE="${NODE_HOME}/bin/node" + if [ ! -x "$EXECUTABLE_NODE" ];then + fail "ERROR: NODE_HOME is set to an invalid directory,check $NODE_HOME\n\nPlease set NODE_HOME in your environment to the location where your nodejs installed" + fi +else + EXECUTABLE_NODE="node" + which ${EXECUTABLE_NODE} > /dev/null 2>&1 || fail "ERROR: NODE_HOME is not set and not 'node' command found in your path" +fi + +# Check hvigor wrapper script +if [ ! -r "$HVIGOR_WRAPPER_SCRIPT" ];then + fail "ERROR: Couldn't find hvigor/hvigor-wrapper.js in ${HVIGOR_APP_HOME}" +fi + +# start hvigor-wrapper script +exec "${EXECUTABLE_NODE}" \ + "${HVIGOR_WRAPPER_SCRIPT}" "$@" diff --git a/taoyao-client-openharmony/taoyao/hvigorw.bat b/taoyao-client-openharmony/taoyao/hvigorw.bat new file mode 100644 index 0000000..6861293 --- /dev/null +++ b/taoyao-client-openharmony/taoyao/hvigorw.bat @@ -0,0 +1,64 @@ +@if "%DEBUG%" == "" @echo off +@rem ########################################################################## +@rem +@rem Hvigor startup script for Windows +@rem +@rem ########################################################################## + +@rem Set local scope for the variables with windows NT shell +if "%OS%"=="Windows_NT" setlocal + +set DIRNAME=%~dp0 +if "%DIRNAME%" == "" set DIRNAME=. +set APP_BASE_NAME=%~n0 +set APP_HOME=%DIRNAME% + +@rem Resolve any "." and ".." in APP_HOME to make it shorter. +for %%i in ("%APP_HOME%") do set APP_HOME=%%~fi + +set WRAPPER_MODULE_PATH=%APP_HOME%\hvigor\hvigor-wrapper.js +set NODE_EXE=node.exe + +goto start + +:start +@rem Find node.exe +if defined NODE_HOME goto findNodeFromNodeHome + +%NODE_EXE% --version >NUL 2>&1 +if "%ERRORLEVEL%" == "0" goto execute + +echo. +echo ERROR: NODE_HOME is not set and no 'node' command could be found in your PATH. +echo. +echo Please set the NODE_HOME variable in your environment to match the +echo location of your NodeJs installation. + +goto fail + +:findNodeFromNodeHome +set NODE_HOME=%NODE_HOME:"=% +set NODE_EXE_PATH=%NODE_HOME%/%NODE_EXE% + +if exist "%NODE_EXE_PATH%" goto execute +echo. +echo ERROR: NODE_HOME is not set and no 'node' command could be found in your PATH. +echo. +echo Please set the NODE_HOME variable in your environment to match the +echo location of your NodeJs installation. + +goto fail + +:execute +@rem Execute hvigor +"%NODE_EXE%" %WRAPPER_MODULE_PATH% %* + +if "%ERRORLEVEL%" == "0" goto hvigorwEnd + +:fail +exit /b 1 + +:hvigorwEnd +if "%OS%" == "Windows_NT" endlocal + +:end diff --git a/taoyao-client-openharmony/taoyao/media/build-profile.json5 b/taoyao-client-openharmony/taoyao/media/build-profile.json5 new file mode 100644 index 0000000..d686a77 --- /dev/null +++ b/taoyao-client-openharmony/taoyao/media/build-profile.json5 @@ -0,0 +1,20 @@ +{ + "apiType": "stageMode", + "buildOption": { + "externalNativeOptions": { + "path": "./src/main/cpp/CMakeLists.txt", + "cppFlags" : "", + "arguments" : "", + // "cppFlags" : "-D_LIBCPP_STD_VER=17", + // "arguments" : "-DOHOS_STL=c++_static", + // "arguments" : "-DOHOS_STL=c++_shared", + "abiFilters": [ "arm64-v8a" ] + } + }, + "targets": [ + { + "name": "default", + "runtimeOS": "OpenHarmony", + } + ] +} diff --git a/taoyao-client-openharmony/taoyao/media/hvigorfile.ts b/taoyao-client-openharmony/taoyao/media/hvigorfile.ts new file mode 100644 index 0000000..dcb7475 --- /dev/null +++ b/taoyao-client-openharmony/taoyao/media/hvigorfile.ts @@ -0,0 +1 @@ +export { hapTasks } from '@ohos/hvigor-ohos-plugin'; diff --git a/taoyao-client-openharmony/taoyao/media/oh-package.json5 b/taoyao-client-openharmony/taoyao/media/oh-package.json5 new file mode 100644 index 0000000..ebdda39 --- /dev/null +++ b/taoyao-client-openharmony/taoyao/media/oh-package.json5 @@ -0,0 +1,11 @@ +{ + "main" : "", + "name" : "media", + "author": "acgist", + "version": "1.0.0", + "license": "Apache-2.0", + "description": "桃夭媒体终端", + "dependencies" : {}, + "devDependencies" : {}, + "dynamicDependencies": {} +} diff --git a/taoyao-client-openharmony/taoyao/media/src/main/cpp/CMakeLists.txt b/taoyao-client-openharmony/taoyao/media/src/main/cpp/CMakeLists.txt new file mode 100644 index 0000000..9ed047f --- /dev/null +++ b/taoyao-client-openharmony/taoyao/media/src/main/cpp/CMakeLists.txt @@ -0,0 +1,53 @@ +cmake_minimum_required(VERSION 3.4.1) + +project(taoyao VERSION 1.0.0 LANGUAGES C CXX) + +# Debug | Release +#-DCMAKE_BUILD_TYPE=Debug +#set(CMAKE_BUILD_TYPE Debug) + +# C编译选项 +set(CMAKE_C_STANDARD 17) +#set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -std=c17 -O3") +set(CMAKE_C_FLAGS_DEBUG "${CMAKE_C_FLAGS_DEBUG} -std=c17 -O0 -g") +set(CMAKE_C_FLAGS_RELEASE "${CMAKE_C_FLAGS_RELEASE} -std=c17 -O3") + +# C++编译选项 +set(CMAKE_CXX_STANDARD 17) +#set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++17 -O3") +set(CMAKE_CXX_FLAGS_DEBUG "${CMAKE_CXX_FLAGS_DEBUG} -std=c++17 -O0 -g") +set(CMAKE_CXX_FLAGS_RELEASE "${CMAKE_CXX_FLAGS_RELEASE} -std=c++17 -O3") + +set(MEDIASOUPCLIENT_LOG_DEV OFF) +set(MEDIASOUPCLIENT_LOG_TRACE OFF) +set(MEDIASOUPCLIENT_BUILD_TESTS OFF) +set(LIBWEBRTC_BINARY_PATH "${CMAKE_CURRENT_SOURCE_DIR}/deps/webrtc/lib/") +set(LIBWEBRTC_INCLUDE_PATH "${CMAKE_CURRENT_SOURCE_DIR}/deps/webrtc/src/") + +add_subdirectory("./deps/libmediasoupclient") + +add_library( + ${PROJECT_NAME} SHARED + bind.cpp + media/Room.cpp + media/Client.cpp + media/RoomClient.cpp + media/LocalClient.cpp + media/RemoteClient.cpp + media/MediaManager.cpp +) + +target_include_directories( + ${PROJECT_NAME} PUBLIC + "./include" + "./deps/webrtc" + "./deps/libmediasoupclient/include" + "./deps/libmediasoupclient/deps/libsdptransform/include" +) + +target_link_libraries( + ${PROJECT_NAME} PUBLIC + mediasoupclient + libace_napi.z.so + libhilog_ndk.z.so +) diff --git a/taoyao-client-openharmony/taoyao/media/src/main/cpp/bind.cpp b/taoyao-client-openharmony/taoyao/media/src/main/cpp/bind.cpp new file mode 100644 index 0000000..45731a2 --- /dev/null +++ b/taoyao-client-openharmony/taoyao/media/src/main/cpp/bind.cpp @@ -0,0 +1,86 @@ +/** + * 方法绑定 + */ + +#include +#include + +#include "hilog/log.h" +#include "napi/native_api.h" + +#include "./include/Room.hpp" +#include "./include/MediaManager.hpp" + +namespace acgist { + +acgist::MediaManager* mediaManager = nullptr; +std::map roomMap; + +static void init() { + OH_LOG_INFO(LOG_APP, "加载libtaoyao"); + // TODO:输出编码能力 + mediaManager = new MediaManager(); + mediaManager->initPeerConnectionFactory(); +} + +static void shutdown() { + OH_LOG_INFO(LOG_APP, "卸载libtaoyao"); + if (mediaManager != nullptr) { + delete mediaManager; + mediaManager = nullptr; + } +// this->roomMap +} + +static napi_value mediaConsume(napi_env env, napi_callback_info info) { return 0; } +static napi_value mediaConsumerClose(napi_env env, napi_callback_info info) { return 0; } +static napi_value mediaConsumerPause(napi_env env, napi_callback_info info) { return 0; } +static napi_value mediaConsumerResume(napi_env env, napi_callback_info info) { return 0; } +static napi_value mediaProducerClose(napi_env env, napi_callback_info info) { return 0; } +static napi_value mediaProducerPause(napi_env env, napi_callback_info info) { return 0; } +static napi_value mediaProducerResume(napi_env env, napi_callback_info info) { return 0; } +static napi_value roomClientList(napi_env env, napi_callback_info info) { return 0; } +static napi_value roomClose(napi_env env, napi_callback_info info) { return 0; } +static napi_value roomEnter(napi_env env, napi_callback_info info) { return 0; } +static napi_value roomExpel(napi_env env, napi_callback_info info) { return 0; } +static napi_value roomInvite(napi_env env, napi_callback_info info) { return 0; } +static napi_value roomLeave(napi_env env, napi_callback_info info) { return 0; } + +} + +EXTERN_C_START +static napi_value Init(napi_env env, napi_value exports) { + napi_property_descriptor desc[] = { + { "mediaConsume", nullptr, acgist::mediaConsume, nullptr, nullptr, nullptr, napi_default, nullptr }, + { "mediaConsumerClose", nullptr, acgist::mediaConsumerClose, nullptr, nullptr, nullptr, napi_default, nullptr }, + { "mediaConsumerPause", nullptr, acgist::mediaConsumerPause, nullptr, nullptr, nullptr, napi_default, nullptr }, + { "mediaConsumerResume", nullptr, acgist::mediaConsumerResume, nullptr, nullptr, nullptr, napi_default, nullptr }, + { "mediaProducerClose", nullptr, acgist::mediaProducerClose, nullptr, nullptr, nullptr, napi_default, nullptr }, + { "mediaProducerPause", nullptr, acgist::mediaProducerPause, nullptr, nullptr, nullptr, napi_default, nullptr }, + { "mediaProducerResume", nullptr, acgist::mediaProducerResume, nullptr, nullptr, nullptr, napi_default, nullptr }, + { "roomClientList", nullptr, acgist::roomClientList, nullptr, nullptr, nullptr, napi_default, nullptr }, + { "roomClose", nullptr, acgist::roomClose, nullptr, nullptr, nullptr, napi_default, nullptr }, + { "roomEnter", nullptr, acgist::roomEnter, nullptr, nullptr, nullptr, napi_default, nullptr }, + { "roomExpel", nullptr, acgist::roomExpel, nullptr, nullptr, nullptr, napi_default, nullptr }, + { "roomInvite", nullptr, acgist::roomInvite, nullptr, nullptr, nullptr, napi_default, nullptr }, + { "roomLeave", nullptr, acgist::roomLeave, nullptr, nullptr, nullptr, napi_default, nullptr }, + }; + napi_define_properties(env, exports, sizeof(desc) / sizeof(napi_property_descriptor), desc); + return exports; +} +EXTERN_C_END + +static napi_module taoyaoModule = { + .nm_version = 1, + .nm_flags = 0, + .nm_filename = nullptr, + .nm_register_func = Init, + .nm_modname = "taoyao", + .nm_priv = ((void*) 0), + .reserved = { 0 }, +}; + +extern "C" __attribute__((constructor)) void RegisterEntryModule(void) { + napi_module_register(&taoyaoModule); + acgist::init(); +} diff --git a/taoyao-client-openharmony/taoyao/media/src/main/cpp/include/AudioCapturer.hpp b/taoyao-client-openharmony/taoyao/media/src/main/cpp/include/AudioCapturer.hpp new file mode 100644 index 0000000..d42b9de --- /dev/null +++ b/taoyao-client-openharmony/taoyao/media/src/main/cpp/include/AudioCapturer.hpp @@ -0,0 +1,5 @@ + +#ifndef TAOYAO_AUDIOCAPTURER_H +#define TAOYAO_AUDIOCAPTURER_H + +#endif //TAOYAO_AUDIOCAPTURER_H diff --git a/taoyao-client-openharmony/taoyao/media/src/main/cpp/include/Capturer.hpp b/taoyao-client-openharmony/taoyao/media/src/main/cpp/include/Capturer.hpp new file mode 100644 index 0000000..73f54d2 --- /dev/null +++ b/taoyao-client-openharmony/taoyao/media/src/main/cpp/include/Capturer.hpp @@ -0,0 +1,24 @@ +/** + * 采集器 + * + * @author acgist + */ + +#ifndef taoyao_Capturer_HPP +#define taoyao_Capturer_HPP + +#include "api/media_stream_track.h" + +namespace acgist { + +class Capturer { + +public: + virtual bool start(); + virtual bool stop(); + +}; + +} + +#endif // taoyao_Capturer_HPP diff --git a/taoyao-client-openharmony/taoyao/media/src/main/cpp/include/Client.hpp b/taoyao-client-openharmony/taoyao/media/src/main/cpp/include/Client.hpp new file mode 100644 index 0000000..4c63735 --- /dev/null +++ b/taoyao-client-openharmony/taoyao/media/src/main/cpp/include/Client.hpp @@ -0,0 +1,19 @@ +/** + * 终端 + * + * @author acgist + */ + +#ifndef taoyao_Client_HPP +#define taoyao_Client_HPP + +namespace acgist { + +class Client { +public: + +}; + +} + +#endif // taoyao_Client_HPP diff --git a/taoyao-client-openharmony/taoyao/media/src/main/cpp/include/LocalClient.hpp b/taoyao-client-openharmony/taoyao/media/src/main/cpp/include/LocalClient.hpp new file mode 100644 index 0000000..f9d734c --- /dev/null +++ b/taoyao-client-openharmony/taoyao/media/src/main/cpp/include/LocalClient.hpp @@ -0,0 +1,10 @@ +/** + * 房间本地终端 + * + * @author acgist + */ + +#ifndef taoyao_LocalClient_HPP +#define taoyao_LocalClient_HPP + +#endif // taoyao_LocalClient_HPP diff --git a/taoyao-client-openharmony/taoyao/media/src/main/cpp/include/MediaManager.hpp b/taoyao-client-openharmony/taoyao/media/src/main/cpp/include/MediaManager.hpp new file mode 100644 index 0000000..377e6cd --- /dev/null +++ b/taoyao-client-openharmony/taoyao/media/src/main/cpp/include/MediaManager.hpp @@ -0,0 +1,32 @@ +/** + * WebRTC媒体服务 + * 提供通道等等创建 + * + * @author acgist + */ + +#ifndef taoyao_MediaManager_HPP +#define taoyao_MediaManager_HPP + +#include "pc/peer_connection.h" +#include "pc/peer_connection_factory.h" + +namespace acgist { + +class MediaManager { +public: + MediaManager(); + ~MediaManager(); +public: + webrtc::PeerConnectionFactory* peerConnectionFactoryPtr; +public: + void initPeerConnectionFactory(); + webrtc::PeerConnection* buildPeerConnection(); + void startCapture(); + void startAudioCapture(); + void startVideoCapture(); +}; + +} + +#endif // taoyao_MediaManager_HPP diff --git a/taoyao-client-openharmony/taoyao/media/src/main/cpp/include/RemoteClient.hpp b/taoyao-client-openharmony/taoyao/media/src/main/cpp/include/RemoteClient.hpp new file mode 100644 index 0000000..ee18992 --- /dev/null +++ b/taoyao-client-openharmony/taoyao/media/src/main/cpp/include/RemoteClient.hpp @@ -0,0 +1,10 @@ +/** + * 房间远程终端 + * + * @author acgist + */ + +#ifndef taoyao_RemoteClient_HPP +#define taoyao_RemoteClient_HPP + +#endif // taoyao_RemoteClient_HPP diff --git a/taoyao-client-openharmony/taoyao/media/src/main/cpp/include/Room.hpp b/taoyao-client-openharmony/taoyao/media/src/main/cpp/include/Room.hpp new file mode 100644 index 0000000..5316e03 --- /dev/null +++ b/taoyao-client-openharmony/taoyao/media/src/main/cpp/include/Room.hpp @@ -0,0 +1,18 @@ +/** + * 房间 + * + * @author acgist + */ + +#ifndef taoyao_Room_HPP +#define taoyao_Room_HPP + +namespace acgist { + +class Room { + +}; + +} + +#endif // taoyao_Room_HPP diff --git a/taoyao-client-openharmony/taoyao/media/src/main/cpp/include/RoomClient.hpp b/taoyao-client-openharmony/taoyao/media/src/main/cpp/include/RoomClient.hpp new file mode 100644 index 0000000..415c970 --- /dev/null +++ b/taoyao-client-openharmony/taoyao/media/src/main/cpp/include/RoomClient.hpp @@ -0,0 +1,10 @@ +/** + * 房间终端 + * + * @author acgist + */ + +#ifndef taoyao_RoomClient_HPP +#define taoyao_RoomClient_HPP + +#endif // taoyao_RoomClient_HPP diff --git a/taoyao-client-openharmony/taoyao/media/src/main/cpp/include/VideoCapturer.hpp b/taoyao-client-openharmony/taoyao/media/src/main/cpp/include/VideoCapturer.hpp new file mode 100644 index 0000000..a51e0b4 --- /dev/null +++ b/taoyao-client-openharmony/taoyao/media/src/main/cpp/include/VideoCapturer.hpp @@ -0,0 +1,5 @@ + +#ifndef TAOYAO_VIDEOCAPTURER_H +#define TAOYAO_VIDEOCAPTURER_H + +#endif //TAOYAO_VIDEOCAPTURER_H diff --git a/taoyao-client-openharmony/taoyao/media/src/main/cpp/media/Client.cpp b/taoyao-client-openharmony/taoyao/media/src/main/cpp/media/Client.cpp new file mode 100644 index 0000000..e69de29 diff --git a/taoyao-client-openharmony/taoyao/media/src/main/cpp/media/LocalClient.cpp b/taoyao-client-openharmony/taoyao/media/src/main/cpp/media/LocalClient.cpp new file mode 100644 index 0000000..e69de29 diff --git a/taoyao-client-openharmony/taoyao/media/src/main/cpp/media/MediaManager.cpp b/taoyao-client-openharmony/taoyao/media/src/main/cpp/media/MediaManager.cpp new file mode 100644 index 0000000..01ca384 --- /dev/null +++ b/taoyao-client-openharmony/taoyao/media/src/main/cpp/media/MediaManager.cpp @@ -0,0 +1,20 @@ +#include "../include/MediaManager.hpp" + +#include "api/peer_connection_interface.h" + +acgist::MediaManager::MediaManager() { + this->peerConnectionFactoryPtr = nullptr; +} + +acgist::MediaManager::~MediaManager() { + if(this->peerConnectionFactoryPtr != nullptr) { +// delete this->peerConnectionFactoryPtr; + this->peerConnectionFactoryPtr->Release(); + this->peerConnectionFactoryPtr = nullptr; + } +} + +void acgist::MediaManager::initPeerConnectionFactory() { + webrtc::PeerConnectionFactoryDependencies dependencies; +// webrtc::PeerConnectionFactory::Create(dependencies); +} diff --git a/taoyao-client-openharmony/taoyao/media/src/main/cpp/media/RemoteClient.cpp b/taoyao-client-openharmony/taoyao/media/src/main/cpp/media/RemoteClient.cpp new file mode 100644 index 0000000..e69de29 diff --git a/taoyao-client-openharmony/taoyao/media/src/main/cpp/media/Room.cpp b/taoyao-client-openharmony/taoyao/media/src/main/cpp/media/Room.cpp new file mode 100644 index 0000000..e69de29 diff --git a/taoyao-client-openharmony/taoyao/media/src/main/cpp/media/RoomClient.cpp b/taoyao-client-openharmony/taoyao/media/src/main/cpp/media/RoomClient.cpp new file mode 100644 index 0000000..e69de29 diff --git a/taoyao-client-openharmony/taoyao/media/src/main/cpp/types/libtaoyao/index.d.ts b/taoyao-client-openharmony/taoyao/media/src/main/cpp/types/libtaoyao/index.d.ts new file mode 100644 index 0000000..1e8719e --- /dev/null +++ b/taoyao-client-openharmony/taoyao/media/src/main/cpp/types/libtaoyao/index.d.ts @@ -0,0 +1,18 @@ +export const sessionCall : () => void; +export const sessionPause : () => void; +export const sessionResume : () => void; +export const sessionExchange: () => void; +export const sessionClose : () => void; +export const mediaConsume : () => void; +export const mediaConsumerClose : () => void; +export const mediaConsumerPause : () => void; +export const mediaConsumerResume: () => void; +export const mediaProducerClose : () => void; +export const mediaProducerPause : () => void; +export const mediaProducerResume: () => void; +export const roomClientList : () => void; +export const roomClose : () => void; +export const roomEnter : () => void; +export const roomExpel : () => void; +export const roomInvite: () => void; +export const roomLeave : () => void; diff --git a/taoyao-client-openharmony/taoyao/media/src/main/cpp/types/libtaoyao/oh-package.json5 b/taoyao-client-openharmony/taoyao/media/src/main/cpp/types/libtaoyao/oh-package.json5 new file mode 100644 index 0000000..e58a0b7 --- /dev/null +++ b/taoyao-client-openharmony/taoyao/media/src/main/cpp/types/libtaoyao/oh-package.json5 @@ -0,0 +1,6 @@ +{ + "name": "libtaoyao.so", + "types": "./index.d.ts", + "version": "", + "description": "桃夭媒体依赖" +} \ No newline at end of file diff --git a/taoyao-client-openharmony/taoyao/media/src/main/ets/entryability/EntryAbility.ts b/taoyao-client-openharmony/taoyao/media/src/main/ets/entryability/EntryAbility.ts new file mode 100644 index 0000000..7bb3d5c --- /dev/null +++ b/taoyao-client-openharmony/taoyao/media/src/main/ets/entryability/EntryAbility.ts @@ -0,0 +1,33 @@ +import hilog from '@ohos.hilog'; +import window from '@ohos.window'; +import UIAbility from '@ohos.app.ability.UIAbility'; + +export default class EntryAbility extends UIAbility { + + onCreate(want, launchParam) { + hilog.info(0x0000, 'EntryAbility', 'onCreate'); + } + + onDestroy() { + hilog.info(0x0000, 'EntryAbility', 'onDestroy'); + } + + onWindowStageCreate(windowStage: window.WindowStage) { + hilog.info(0x0000, 'EntryAbility', 'onWindowStageCreate'); + windowStage.loadContent('pages/Index', (err, data) => { + }); + } + + onWindowStageDestroy() { + hilog.info(0x0000, 'EntryAbility', 'onWindowStageDestroy'); + } + + onForeground() { + hilog.info(0x0000, 'EntryAbility', 'onForeground'); + } + + onBackground() { + hilog.info(0x0000, 'EntryAbility', 'onBackground'); + } + +}; diff --git a/taoyao-client-openharmony/taoyao/media/src/main/ets/pages/Index.ets b/taoyao-client-openharmony/taoyao/media/src/main/ets/pages/Index.ets new file mode 100644 index 0000000..6d03b7e --- /dev/null +++ b/taoyao-client-openharmony/taoyao/media/src/main/ets/pages/Index.ets @@ -0,0 +1,31 @@ +import { signal } from "../taoyao/TaoyaoSignal"; + +@Entry +@Component +struct Index { + + build() { + Row() { + Column() { + Button("连接信令") + .fontSize(20) + .fontWeight(FontWeight.Bold) + .onClick(() => { + // signal.connect(); + }); + } + .width('50%'); + Column() { + Button("断开信令") + .fontSize(20) + .fontWeight(FontWeight.Bold) + .onClick(() => { + // signal.close(); + }); + } + .width('50%'); + } + .height('100%'); + } + +} diff --git a/taoyao-client-openharmony/taoyao/media/src/main/ets/taoyao/MediaManager.ets b/taoyao-client-openharmony/taoyao/media/src/main/ets/taoyao/MediaManager.ets new file mode 100644 index 0000000..e69de29 diff --git a/taoyao-client-openharmony/taoyao/media/src/main/ets/taoyao/Setting.ets b/taoyao-client-openharmony/taoyao/media/src/main/ets/taoyao/Setting.ets new file mode 100644 index 0000000..cae4582 --- /dev/null +++ b/taoyao-client-openharmony/taoyao/media/src/main/ets/taoyao/Setting.ets @@ -0,0 +1,35 @@ +/** + * 配置 + * + * @author acgist + */ + +class Signal { + // 终端名称 + name: string = "鸿蒙"; + // 终端ID + clientId: string = "harmony"; + // 终端类型 + clientType: string = "MOBILE"; + // 信令账号 + username: string = "taoyao"; + // 信令密码 + password: string = "taoyao"; +}; + +class Setting { + + // 信令地址 + signalAddress: string = "wss://192.168.8.204:8888/websocket.signal"; + // 信令版本 + version: string = "1.0.0"; + // 信令配置 + signal: Signal = new Signal(); + +}; + +const setting = new Setting(); + +export { + setting +} diff --git a/taoyao-client-openharmony/taoyao/media/src/main/ets/taoyao/TaoyaoSignal.ets b/taoyao-client-openharmony/taoyao/media/src/main/ets/taoyao/TaoyaoSignal.ets new file mode 100644 index 0000000..5bcb1a1 --- /dev/null +++ b/taoyao-client-openharmony/taoyao/media/src/main/ets/taoyao/TaoyaoSignal.ets @@ -0,0 +1,211 @@ +/** + * 信令连接 + * + * @author acgist + */ + +import hilog from '@ohos.hilog'; +import webSocket from '@ohos.net.webSocket'; + +import { setting } from './Setting'; +import libtaoyao from 'libtaoyao.so' + +interface BusinessError extends Error { + code: number; + data?: T; +} + +class TaoyaoSignal { + + // // WebSocket信令连接 + // socket: webSocket.WebSocket; + // // 是否关闭 + // closed: boolean = false; + // // 是否连接成功 + // connected: boolean = false; + // // 心跳定时 + // heartbeatTimer: number; + // // 同步请求 + // callbackMapping = new Map(); + // // 当前消息索引 + // index: number = 0; + // // 最大消息索引 + // maxIndex: number = 999; + // // 当前终端索引 + // clientIndex: number = 99999; + // + // connect() { + // if(this.socket) { + // this.socket.close(); + // } + // this.connected = false; + // hilog.info(0x0000, 'TaoyaoSignal', '连接信令:%s', setting.signalAddress); + // this.socket = webSocket.createWebSocket(); + // this.socket.on('open', (err: BusinessError, value: Object) => { + // hilog.info(0x0000, 'TaoyaoSignal', '打开信令:%s', setting.signalAddress); + // this.register(); + // this.connected = true; + // }); + // this.socket.on('message', (err: BusinessError, value: string | ArrayBuffer) => { + // hilog.debug(0x0000, 'TaoyaoSignal', '信令消息:%s', value); + // try { + // this.onMessage(value); + // } catch (error) { + // hilog.error(0x0000, 'TaoyaoSignal', '处理信令消息异常:%s', value, error); + // } + // }); + // this.socket.on('close', (err: BusinessError, value: Object) => { + // hilog.error(0x0000, 'TaoyaoSignal', '关闭信令:%s', setting.signalAddress, err); + // this.reconnect(); + // }); + // this.socket.on('error', (err: BusinessError) => { + // hilog.error(0x0000, 'TaoyaoSignal', '信令异常:%s', setting.signalAddress, err); + // this.reconnect(); + // }); + // this.socket.connect(setting.signalAddress, (err: BusinessError, value: boolean) => { + // hilog.info(0x0000, 'TaoyaoSignal', '信令连接成功:%s', setting.signalAddress); + // }); + // }; + // + // reconnect() { + // if(!this.closed) { + // setTimeout(() => this.connect(), 5000); + // } + // } + // + // close() { + // hilog.info(0x0000, 'TaoyaoSignal', '关闭信令:%s', setting.signalAddress); + // this.closed = true; + // this.connected = false; + // if(this.socket) { + // this.socket.close(); + // } + // } + // + // async register() { + // const response: any = await this.request("client::register", { + // name : setting.signal.name, + // clientId : setting.signal.clientId, + // clientType: setting.signal.clientType, + // username : setting.signal.username, + // password : setting.signal.password, + // battery : 100, + // charging : true, + // }); + // const { body } = response; + // const { index } = body; + // this.clientIndex = index; + // hilog.info(0x0000, "TaoyaoSignal", "信令注册成功:%d", index); + // this.heartbeat(); + // } + // + // heartbeat() { + // if(this.heartbeatTimer) { + // clearInterval(this.heartbeatTimer); + // } + // this.heartbeatTimer = setInterval(() => { + // this.send("client::heartbeat", { + // battery : 100, + // charging: true, + // }); + // }, 30 * 1000); + // }; + // + // buildId() { + // if (++this.index > this.maxIndex) { + // this.index = 0; + // } + // const date = new Date(); + // return ( + // 100000000000000 * date.getDate() + + // 1000000000000 * date.getHours() + + // 10000000000 * date.getMinutes() + + // 100000000 * date.getSeconds() + + // 1000 * this.clientIndex + + // this.index + // ); + // } + // + // send(signal, body) { + // const header = { + // v: setting.version, + // id: this.buildId(), + // signal + // }; + // const message = { + // header, + // body + // }; + // try { + // this.socket.send(JSON.stringify(message)); + // } catch (error) { + // hilog.error(0x0000, 'TaoyaoSignal', '发送消息异常:%o', message, error); + // } + // } + // + // async request(signal, body) { + // const id = this.buildId(); + // return new Promise((resolve, reject) => { + // const header = { + // v: setting.version, + // id, + // signal + // }; + // const message = { + // header, + // body + // }; + // // 设置超时 + // const rejectTimeout = setTimeout(() => { + // this.callbackMapping.delete(id); + // reject("请求超时"); + // }, 5000); + // // 请求回调 + // this.callbackMapping.set(id, (response) => { + // resolve(response); + // clearTimeout(rejectTimeout); + // // 默认不用继续处理 + // return true; + // }); + // // 发送消息 + // try { + // this.socket.send(JSON.stringify(message)); + // } catch (error) { + // hilog.error(0x0000, 'TaoyaoSignal', '发送消息异常:%o', message, error); + // reject(error); + // } + // }); + // } + // + // onMessage(message) { + // const json = JSON.parse(message); + // const { + // header, + // body, + // } = json; + // const { + // id + // } = header; + // if (this.callbackMapping.has(id)) { + // hilog.info(0x0000, "TaoyaoSignal", "处理同步消息:%s", message); + // try { + // if( + // this.callbackMapping.get(id)(json) + // ) { + // return; + // } + // } finally { + // this.callbackMapping.delete(id); + // } + // } + // hilog.info(0x0000, "TaoyaoSignal", "处理异步消息:%s", message); + // // TODO + // } + +} + +const signal = new TaoyaoSignal(); + +export { + signal +} diff --git a/taoyao-client-openharmony/taoyao/media/src/main/module.json5 b/taoyao-client-openharmony/taoyao/media/src/main/module.json5 new file mode 100644 index 0000000..20f8a19 --- /dev/null +++ b/taoyao-client-openharmony/taoyao/media/src/main/module.json5 @@ -0,0 +1,57 @@ +{ + "module": { + "name" : "media", + "type" : "entry", + "pages": "$profile:main_pages", + "description": "$string:module_desc", + "mainElement": "EntryAbility", + "installationFree" : false, + "deliveryWithInstall": true, + "deviceTypes": [ + "default", + "tablet" + ], + "abilities": [ + { + "name" : "EntryAbility", + "icon" : "$media:icon", + "label": "$string:EntryAbility_label", + "exported": true, + "srcEntry": "./ets/entryability/EntryAbility.ts", + "description": "$string:EntryAbility_desc", + "startWindowIcon": "$media:icon", + "startWindowBackground": "$color:start_window_background", + "skills": [ + { + "entities": [ + "entity.system.home" + ], + "actions": [ + "action.system.home" + ] + } + ] + } + ], + "requestPermissions": [ + { + "name": "ohos.permission.CAMERA", + "usedScene": { + "when": "always" + } + }, + { + "name": "ohos.permission.INTERNET", + "usedScene": { + "when": "always" + } + }, + { + "name": "ohos.permission.MICROPHONE", + "usedScene": { + "when": "always" + } + } + ] + } +} diff --git a/taoyao-client-openharmony/taoyao/media/src/main/resources/base/element/color.json b/taoyao-client-openharmony/taoyao/media/src/main/resources/base/element/color.json new file mode 100644 index 0000000..162a7b6 --- /dev/null +++ b/taoyao-client-openharmony/taoyao/media/src/main/resources/base/element/color.json @@ -0,0 +1,8 @@ +{ + "color": [ + { + "name": "start_window_background", + "value": "#FFFFFF" + } + ] +} diff --git a/taoyao-client-openharmony/taoyao/media/src/main/resources/base/element/string.json b/taoyao-client-openharmony/taoyao/media/src/main/resources/base/element/string.json new file mode 100644 index 0000000..9caab5d --- /dev/null +++ b/taoyao-client-openharmony/taoyao/media/src/main/resources/base/element/string.json @@ -0,0 +1,16 @@ +{ + "string": [ + { + "name": "module_desc", + "value": "桃夭媒体服务" + }, + { + "name": "EntryAbility_desc", + "value": "桃夭媒体服务" + }, + { + "name": "EntryAbility_label", + "value": "桃夭" + } + ] +} diff --git a/taoyao-client-openharmony/taoyao/media/src/main/resources/base/media/icon.png b/taoyao-client-openharmony/taoyao/media/src/main/resources/base/media/icon.png new file mode 100644 index 0000000000000000000000000000000000000000..002ccf8ff5710c5f3352c68c526a320b015c8d2e GIT binary patch literal 6477 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 literal 0 HcmV?d00001 diff --git a/taoyao-client-openharmony/taoyao/media/src/main/resources/base/profile/main_pages.json b/taoyao-client-openharmony/taoyao/media/src/main/resources/base/profile/main_pages.json new file mode 100644 index 0000000..1898d94 --- /dev/null +++ b/taoyao-client-openharmony/taoyao/media/src/main/resources/base/profile/main_pages.json @@ -0,0 +1,5 @@ +{ + "src": [ + "pages/Index" + ] +} diff --git a/taoyao-client-openharmony/taoyao/oh-package.json5 b/taoyao-client-openharmony/taoyao/oh-package.json5 new file mode 100644 index 0000000..6ea7e6a --- /dev/null +++ b/taoyao-client-openharmony/taoyao/oh-package.json5 @@ -0,0 +1,13 @@ +{ + "name" : "taoyao", + "main" : "", + "author": "acgist", + "version": "1.0.0", + "license": "Apache-2.0", + "description" : "桃夭鸿蒙终端", + "dependencies": {}, + "devDependencies": { + "@ohos/hamock": "1.0.0", + "@ohos/hypium": "1.0.13" + }, +}