diff --git a/.github/ISSUE_TEMPLATE/bug_report.yml b/.github/ISSUE_TEMPLATE/bug_report.yml index 9065890cd..19a67ef04 100644 --- a/.github/ISSUE_TEMPLATE/bug_report.yml +++ b/.github/ISSUE_TEMPLATE/bug_report.yml @@ -27,6 +27,10 @@ body: What version of the package are you using? You can check the Unity version in Package Manager Window. See [manual](https://docs.unity3d.com/Manual/upm-ui.html). options: + - 3.1.0-exp.8 + - 3.1.0-exp.7 + - 3.1.0-exp.6 + - 3.1.0-exp.5 - 3.1.0-exp.4 - 3.1.0-exp.3 - 3.1.0-exp.2 diff --git a/.yamato/compile-package.yml b/.yamato/compile-package.yml new file mode 100644 index 000000000..af37b9c19 --- /dev/null +++ b/.yamato/compile-package.yml @@ -0,0 +1,49 @@ +compile_test_for_package_version: + name: Compilation Test for Package Version + agent: + type: Unity::VM + flavor: b1.large + image: package-ci/win10:v4 + variables: + VERSION: 3.1.0-exp.7 + commands: + # When unity-config will be part of the image, this will turn into a no-op + - | + where /q unity-config + if ERRORLEVEL 1 ( + %GSUDO% choco install unity-config -y -s https://artifactory.prd.it.unity3d.com/artifactory/api/nuget/unity-choco-local + ) + - unity-downloader-cli -c editor -u 2020.3 --wait + - .Editor\Unity.exe -createProject CompilationTestProject -logFile logs\CreateProject.log -batchmode -quit + - | + unity-config project set registry --project-path CompilationTestProject candidates + unity-config project add dependency --project-path CompilationTestProject com.unity.renderstreaming@%VERSION% + - .Editor\Unity.exe -projectPath CompilationTestProject -logFile logs\CompilePackage.log -batchmode -quit + artifacts: + logs: + paths: + - logs/* + +compile_test_for_local_path: + name: Compilation Test for Local Path + agent: + type: Unity::VM + flavor: b1.large + image: package-ci/win10:v4 + commands: + # When unity-config will be part of the image, this will turn into a no-op + - | + where /q unity-config + if ERRORLEVEL 1 ( + %GSUDO% choco install unity-config -y -s https://artifactory.prd.it.unity3d.com/artifactory/api/nuget/unity-choco-local + ) + - unity-downloader-cli -c editor -u 2020.3 --wait + - .Editor\Unity.exe -createProject CompilationTestProject -logFile logs\CreateProject.log -batchmode -quit + - | + unity-config project set registry --project-path CompilationTestProject candidates + unity-config project add dependency --project-path CompilationTestProject .\com.unity.renderstreaming + - .Editor\Unity.exe -projectPath CompilationTestProject -logFile logs\CompilePackage.log -batchmode -quit + artifacts: + logs: + paths: + - logs/* diff --git a/.yamato/coverage.yml b/.yamato/coverage.yml new file mode 100644 index 000000000..7ec307cc5 --- /dev/null +++ b/.yamato/coverage.yml @@ -0,0 +1,38 @@ +{% metadata_file .yamato/package.metafile %} + +# todo(kazuki): Use old version because Code Coverage 1.2.2 has some issues. +coverage_pkg_version: 1.1.1 +--- + +{% for platform in platforms %} +{% if platform.name != "macos" and platform.name != "macos-m1" %} +{% for editor in editors %} +codecoverage_{{ packagename }}_{{ platform.name }}_{{ editor.version }}: + name: Code coverage {{ package_displayname }} {{ platform.name }} {{ editor.version }} + agent: + type: {{ platform.type }} + image: {{ platform.image }} + flavor: {{ platform.flavor }} + commands: + - pip config set global.index-url https://artifactory.prd.it.unity3d.com/artifactory/api/pypi/pypi/simple + - pip install unity-downloader-cli --index-url https://artifactory.prd.it.unity3d.com/artifactory/api/pypi/pypi/simple + - npm install upm-ci-utils@{{ upm.package_version }} -g --registry {{ upm.registry_url }} +{% if platform.name == "win" %} + - | + set WEBAPP_PATH=%cd%\Webapp\bin~\{{ platform.packed_webapp_name }} + upm-ci package test -u {{ editor.version }} --extra-utr-arg=--coverage-pkg-version={{ coverage_pkg_version }} --package-path {{ packagename }} --enable-code-coverage --code-coverage-options "generateAdditionalMetrics;generateHtmlReport;generateBadgeReport;assemblyFilters:-UnityEngine.*,+Unity.RenderStreaming" +{% else %} + - | + export WEBAPP_PATH=$(pwd)/WebApp/bin~/{{ platform.packed_webapp_name }} + upm-ci package test -u {{ editor.version }} --extra-utr-arg=--coverage-pkg-version={{ coverage_pkg_version }} --package-path {{ packagename }} --enable-code-coverage --code-coverage-options "generateAdditionalMetrics;generateHtmlReport;generateBadgeReport;assemblyFilters:-UnityEngine.*,+Unity.RenderStreaming" +{% endif %} + artifacts: + {{ packagename }}_{{ editor.version }}_{{ platform.name }}_coverage_results: + paths: + - "upm-ci~/test-results/**" + dependencies: + - .yamato/upm-ci-renderstreaming-packages.yml#pack + - .yamato/upm-ci-webapp.yml#pack_{{ platform.packed_webapp_platform }} +{% endfor %} +{% endif %} +{% endfor %} diff --git a/.yamato/format.yml b/.yamato/format.yml new file mode 100644 index 000000000..0d411e69b --- /dev/null +++ b/.yamato/format.yml @@ -0,0 +1,15 @@ +# Check formatting using dotnet-format tool. +check_formatting_dotnet-format: + name: Checking codes formatting using dotnet-format tool + agent: + type: Unity::VM::osx + image: package-ci/macos-12:v4 + flavor: b1.large + commands: + - dotnet tool install --tool-path tools dotnet-format || echo dotnet format already installed + - tools/dotnet-format --check --exclude RenderStreaming~ -f . 1>formatting.log 2>formatting_errors.log + artifacts: + logs: + paths: + - formatting.log + - formatting_errors.log diff --git a/.yamato/package.metafile b/.yamato/package.metafile index 1d57d955c..0dc45d010 100644 --- a/.yamato/package.metafile +++ b/.yamato/package.metafile @@ -2,13 +2,16 @@ upm: registry_url: https://artifactory.prd.cds.internal.unity3d.com/artifactory/api/npm/upm-npm package_version: stable intra_pypi_url: https://artifactory.prd.it.unity3d.com/artifactory/api/pypi/pypi/simple +packagename: com.unity.renderstreaming +package_displayname: Render Streaming editors: - version: 2020.3 - version: 2021.3 - - version: 2022.1 + - version: 2022.3 + - version: 2023.1 - version: trunk platforms: - - name: win + - name: win-gpu type: Unity::VM::GPU image: renderstreaming/win10:v0.3.13-1084240 flavor: b1.large @@ -27,9 +30,24 @@ platforms: platform: standalone - backend: il2cpp platform: standalone + - name: win + type: Unity::VM + image: renderstreaming/win10:v0.3.13-1084239 + flavor: b1.large + packed_webapp_name: webserver.exe + packed_webapp_platform: win + test_params: + - backend: mono + platform: editmode + - backend: mono + platform: playmode + - backend: mono + platform: standalone + - backend: il2cpp + platform: standalone - name: macos type: Unity::metal::macmini - image: package-ci/mac:v1.20.0-1079282 + image: package-ci/macos-12:v4.10.0-1271191 flavor: m1.mac architecture: x64 packed_webapp_name: webserver_mac @@ -49,7 +67,7 @@ platforms: platform: standalone - name: macos-m1 type: Unity::metal::devkit - image: package-ci/mac:v1.20.0-1079282 + image: package-ci/macos-12:v4.10.0-1271191 flavor: m1.mac architecture: arm64 packed_webapp_name: webserver_mac @@ -68,7 +86,7 @@ platforms: # - backend: il2cpp # additional_component_arg: StandaloneSupport-IL2CPP # platform: standalone - - name: linux + - name: linux-gpu type: Unity::VM::GPU image: renderstreaming/ubuntu:v0.2.4-1104053 flavor: b1.large diff --git a/.yamato/promotion.yml b/.yamato/promotion.yml index f7795c711..70aa8a506 100644 --- a/.yamato/promotion.yml +++ b/.yamato/promotion.yml @@ -3,14 +3,10 @@ test_platforms: - name: win type: Unity::VM - image: package-ci/win10:v1.21.0-1103459 + image: package-ci/win10:v4 flavor: b1.large -packages: - - name: renderstreaming - packagename: com.unity.renderstreaming --- -{% for package in packages %} {% for editor in editors %} {% for platform in test_platforms %} promotion_test_{{ platform.name }}_{{ editor.version }}: @@ -23,13 +19,13 @@ promotion_test_{{ platform.name }}_{{ editor.version }}: UPMCI_PROMOTION: 1 commands: - npm install upm-ci-utils@{{ upm.package_version }} -g --registry {{ upm.registry_url }} - - upm-ci package test --unity-version {{ editor.version }} --package-path {{ package.packagename }} --platform editmode --backend mono + - upm-ci package test --unity-version {{ editor.version }} --package-path {{ packagename }} --platform editmode --backend mono artifacts: logs: paths: - "upm-ci~/test-results/**/*" dependencies: - - .yamato/upm-ci-renderstreaming-packages.yml#pack_{{ package.name }} + - .yamato/upm-ci-renderstreaming-packages.yml#pack {% endfor %} {% endfor %} @@ -37,13 +33,13 @@ promote_dry_run: name: Promote Dry Run to Production agent: type: Unity::VM - image: package-ci/win10:v1.21.0-1103459 + image: package-ci/win10:v4 flavor: b1.large variables: UPMCI_PROMOTION: 1 commands: - npm install upm-ci-utils@{{ upm.package_version }} -g --registry {{ upm.registry_url }} - - upm-ci package promote --dry-run --package-path {{ package.packagename }} + - upm-ci package promote --dry-run --package-path {{ packagename }} triggers: tags: only: @@ -53,7 +49,7 @@ promote_dry_run: paths: - "upm-ci~/packages/*.tgz" dependencies: - - .yamato/upm-ci-renderstreaming-packages.yml#pack_{{ package.name }} + - .yamato/upm-ci-renderstreaming-packages.yml#pack {% for editor in editors %} {% if editor.version != "trunk" -%} # exclude trunk to test {% for platform in test_platforms %} @@ -66,13 +62,13 @@ promote: name: Promote to Production agent: type: Unity::VM - image: package-ci/win10:v1.21.0-1103459 + image: package-ci/win10:v4 flavor: b1.large variables: UPMCI_PROMOTION: 1 commands: - npm install upm-ci-utils@{{ upm.package_version }} -g --registry {{ upm.registry_url }} - - upm-ci package promote --package-path {{ package.packagename }} + - upm-ci package promote --package-path {{ packagename }} triggers: tags: only: @@ -82,7 +78,7 @@ promote: paths: - "upm-ci~/packages/*.tgz" dependencies: - - .yamato/upm-ci-renderstreaming-packages.yml#pack_{{ package.name }} + - .yamato/upm-ci-renderstreaming-packages.yml#pack {% for editor in editors %} {% if editor.version != "trunk" -%} # exclude trunk to test {% for platform in test_platforms %} @@ -90,5 +86,3 @@ promote: {% endfor %} {% endif %} {% endfor %} - -{% endfor %} diff --git a/.yamato/upm-ci-publish-github-release.yml b/.yamato/upm-ci-publish-github-release.yml index 406053110..b2cf62668 100644 --- a/.yamato/upm-ci-publish-github-release.yml +++ b/.yamato/upm-ci-publish-github-release.yml @@ -1,4 +1,3 @@ -# .yamato/upm-ci-publish-github-release.yml {% metadata_file .yamato/package.metafile %} webapp-platforms: diff --git a/.yamato/upm-ci-renderstreaming-packages.yml b/.yamato/upm-ci-renderstreaming-packages.yml index 90e411606..f7fbe8f7f 100644 --- a/.yamato/upm-ci-renderstreaming-packages.yml +++ b/.yamato/upm-ci-renderstreaming-packages.yml @@ -1,12 +1,9 @@ {% metadata_file .yamato/package.metafile %} -packages: - - name: renderstreaming - packagename: com.unity.renderstreaming --- -{% for package in packages %} -pack_{{ package.name }}: - name: Pack {{ package.packagename }} + +pack: + name: Pack {{ package_displayname }} agent: type: Unity::VM image: package-ci/ubuntu-20:v1.4.0-1081009 @@ -14,18 +11,18 @@ pack_{{ package.name }}: commands: - npm install upm-ci-utils@{{ upm.package_version }} -g --registry {{ upm.registry_url }} - find ./{{ project.packagename }} -type l -exec bash -c 'sh BuildScripts~/convert_symlinks.sh "$0"' {} \; - - upm-ci package pack --package-path {{ package.packagename }} + - upm-ci package pack --package-path {{ packagename }} artifacts: - {{ package.name }}_package: + {{ packagename }}_package: paths: - "upm-ci~/packages/**/*" {% for editor in editors %} -build_{{ package.name }}_{{ editor.version }}_ios: - name : Build {{ package.packagename }} with {{ editor.version }} for ios device +build_{{ editor.version }}_ios: + name : Build {{ package_displayname }} with {{ editor.version }} for ios device agent: type: Unity::VM::osx - image: package-ci/mac:v1.20.0-1079282 + image: package-ci/macos-12:v4.10.0-1271191 flavor: b1.large commands: - find upm-ci~/packages/ -name "*.tgz" | xargs -I file tar xvf file -C upm-ci~ @@ -42,13 +39,14 @@ build_{{ package.name }}_{{ editor.version }}_ios: paths: - "build/logs/**" dependencies: - - .yamato/upm-ci-{{ package.name }}-packages.yml#pack_{{ package.name }} + - .yamato/upm-ci-renderstreaming-packages.yml#pack -test_{{ package.name }}_{{ editor.version }}_ios: - name: Test {{ package.packagename }} with {{ editor.version }} on ios device +test_{{ packagename }}_{{ editor.version }}_ios: + name: Test {{ package_displayname }} with {{ editor.version }} on ios device agent: type: Unity::mobile::iPhone - image: mobile/macos-10.15-testing:v0.0.7-909915 + image: package-ci/macos-12:v4.10.0-1271191 + model: SE flavor: b1.medium skip_checkout: true commands: @@ -63,22 +61,22 @@ test_{{ package.name }}_{{ editor.version }}_ios: paths: - "build/test-results/**" dependencies: - - .yamato/upm-ci-{{ package.name }}-packages.yml#build_{{ package.name }}_{{ editor.version }}_ios + - .yamato/upm-ci-renderstreaming-packages.yml#build_{{ editor.version }}_ios {% for target in test_targets_android %} -build_{{ package.name }}_{{ editor.version }}_android_{{ target.name }}: - name : Build {{ package.packagename }} with {{ editor.version }} for android device {{ target.name }} +build_{{ editor.version }}_android_{{ target.name }}: + name : Build {{ package_displayname }} with {{ editor.version }} for android device {{ target.name }} agent: type: Unity::VM::osx - image: package-ci/mac:v1.20.0-1079282 + image: package-ci/macos-12:v4.10.0-1271191 flavor: b1.xlarge commands: - | find upm-ci~/packages/ -name "*.tgz" | xargs -I file tar xvf file -C upm-ci~ cp -rf upm-ci~/package/Runtime/Plugins Runtime/ -{% if target.name == "vulkan" -%} +{% if target.name == "vulkan" %} cp -f TestProjects/Empty/ProjectSettings/ProjectSettings-android-vulkan.asset TestProjects/Empty/ProjectSettings/ProjectSettings.asset -{% endif -%} +{% endif %} - pip install unity-downloader-cli --index-url https://artifactory.prd.it.unity3d.com/artifactory/api/pypi/pypi/simple - unity-downloader-cli -c Editor -c Android -u {{ editor.version }} --fast -w - curl -s https://artifactory.prd.it.unity3d.com/artifactory/unity-tools/utr-standalone/utr --output utr @@ -92,17 +90,17 @@ build_{{ package.name }}_{{ editor.version }}_android_{{ target.name }}: paths: - "build/logs/**" dependencies: - - .yamato/upm-ci-{{ package.name }}-packages.yml#pack_{{ package.name }} + - .yamato/upm-ci-renderstreaming-packages.yml#pack -test_{{ package.name }}_{{ editor.version }}_android_{{ target.name }}: - name: Test {{ package.packagename }} with {{ editor.version }} on android device {{ target.name }} +test_{{ packagename }}_{{ editor.version }}_android_{{ target.name }}: + name: Test {{ package_displayname }} with {{ editor.version }} on android device {{ target.name }} agent: type: Unity::mobile::shield image: mobile/android-package-ci-win:v0.1.4-1212670 flavor: b1.medium skip_checkout: true dependencies: - - .yamato/upm-ci-{{ package.name }}-packages.yml#build_{{ package.name }}_{{ editor.version }}_android_{{ target.name }} + - .yamato/upm-ci-renderstreaming-packages.yml#build_{{ editor.version }}_android_{{ target.name }} commands: - wget http://artifactory-slo.bf.unity3d.com/artifactory/mobile-generic/android/ADBKeys.zip!/adbkey.pub -O %USERPROFILE%/.android/adbkey.pub - wget http://artifactory-slo.bf.unity3d.com/artifactory/mobile-generic/android/ADBKeys.zip!/adbkey -O %USERPROFILE%/.android/adbkey @@ -126,8 +124,8 @@ test_{{ package.name }}_{{ editor.version }}_android_{{ target.name }}: {% for platform in platforms %} {% if platform.name != "macos" and platform.name != "macos-m1" %} {% for param in platform.test_params %} -test_{{ package.name }}_{{ param.platform }}_{{ param.backend }}_{{ platform.name }}_{{ editor.version }}: - name : Test {{ package.packagename }} {{ param.platform }} {{ param.backend }} {{ editor.version }} on {{ platform.name }} +test_{{ packagename }}_{{ param.platform }}_{{ param.backend }}_{{ platform.name }}_{{ editor.version }}: + name : Test {{ package_displayname }} {{ param.platform }} {{ param.backend }} {{ editor.version }} on {{ platform.name }} agent: type: {{ platform.type }} image: {{ platform.image }} @@ -139,21 +137,21 @@ test_{{ package.name }}_{{ param.platform }}_{{ param.backend }}_{{ platform.nam - pip config set global.index-url https://artifactory.prd.it.unity3d.com/artifactory/api/pypi/pypi/simple - pip install unity-downloader-cli --index-url https://artifactory.prd.it.unity3d.com/artifactory/api/pypi/pypi/simple - npm install upm-ci-utils@{{ upm.package_version }} -g --registry {{ upm.registry_url }} -{% if platform.name == "win" %} +{% if platform.name == "win" or platform.name == "win-gpu" %} - | set WEBAPP_PATH=%cd%\Webapp\bin~\{{ platform.packed_webapp_name }} - upm-ci package test -u {{ editor.version }} --package-path {{ package.packagename }} --platform {{ param.platform }} --backend {{ param.backend }} --extra-utr-arg="--timeout=3000" + upm-ci package test -u {{ editor.version }} --package-path {{ packagename }} --platform {{ param.platform }} --backend {{ param.backend }} --enable-load-and-test-isolation {% else %} - | export WEBAPP_PATH=$(pwd)/WebApp/bin~/{{ platform.packed_webapp_name }} - upm-ci package test -u {{ editor.version }} --package-path {{ package.packagename }} --platform {{ param.platform }} --backend {{ param.backend }} --extra-utr-arg="--timeout=3000 --testfilter=!HttpSignaling" + upm-ci package test -u {{ editor.version }} --package-path {{ packagename }} --platform {{ param.platform }} --backend {{ param.backend }} --extra-utr-arg="--testfilter=!HttpSignaling" --enable-load-and-test-isolation {% endif %} artifacts: - {{ package.name }}_{{ editor.version }}_{{ platform.name }}_test_results: + {{ packagename }}_{{ editor.version }}_{{ platform.name }}_test_results: paths: - "upm-ci~/test-results/**/*" dependencies: - - .yamato/upm-ci-renderstreaming-packages.yml#pack_{{ package.name }} + - .yamato/upm-ci-renderstreaming-packages.yml#pack - .yamato/upm-ci-webapp.yml#pack_{{ platform.packed_webapp_platform }} {% for project in test_projects %} @@ -170,21 +168,21 @@ test_{{ project.name }}_{{ param.platform }}_{{ param.backend }}_{{ platform.nam - pip config set global.index-url https://artifactory.prd.it.unity3d.com/artifactory/api/pypi/pypi/simple - pip install unity-downloader-cli --index-url https://artifactory.prd.it.unity3d.com/artifactory/api/pypi/pypi/simple - npm install upm-ci-utils@{{ upm.package_version }} -g --registry {{ upm.registry_url }} -{% if platform.name != "win" %} - - find ./{{ package.packagename }} -type l -exec bash -c 'sh BuildScripts~/convert_symlinks.sh "$0"' {} \; +{% if platform.name != "win" and platform.name != "win-gpu" %} + - find ./{{ packagename }} -type l -exec bash -c 'sh BuildScripts~/convert_symlinks.sh "$0"' {} \; {% endif %} - upm-ci project pack --project-path {{ project.path }} -{% if platform.name == "win" %} +{% if platform.name == "win" or platform.name == "win-gpu" %} - | set WEBAPP_PATH=%cd%\Webapp\bin~\{{ platform.packed_webapp_name }} - upm-ci project test -u {{ editor.version }} --project-path {{ project.path }} --platform {{ param.platform }} --backend {{ param.backend }} --extra-utr-arg="--timeout=3000" + upm-ci project test -u {{ editor.version }} --project-path {{ project.path }} --platform {{ param.platform }} --backend {{ param.backend }} {% else %} - | export WEBAPP_PATH=$(pwd)/WebApp/bin~/{{ platform.packed_webapp_name }} - upm-ci project test -u {{ editor.version }} --project-path {{ project.path }} --platform {{ param.platform }} --backend {{ param.backend }} --extra-utr-arg="--timeout=3000 --testfilter=!HttpSignaling" + upm-ci project test -u {{ editor.version }} --project-path {{ project.path }} --platform {{ param.platform }} --backend {{ param.backend }} --extra-utr-arg="--testfilter=!HttpSignaling" {% endif %} artifacts: - {{ package.name }}_{{ editor.version }}_{{ platform.name }}_test_results: + {{ packagename }}_{{ editor.version }}_{{ platform.name }}_test_results: paths: - "upm-ci~/test-results/**/*" dependencies: @@ -197,11 +195,11 @@ test_{{ project.name }}_{{ param.platform }}_{{ param.backend }}_{{ platform.nam {% if param.platform == "standalone" %} # platform.name == "macos" or platform.name == "macos-m1" and param.platform == "standalone" -build_{{ package.name }}_{{ param.platform }}_{{ param.backend }}_{{ platform.name }}_{{ editor.version }}: - name : Build {{ package.packagename }} with {{ param.platform }} {{ param.backend }} {{ editor.version }} on {{ platform.name }} +build_{{ param.platform }}_{{ param.backend }}_{{ platform.name }}_{{ editor.version }}: + name : Build {{ package_displayname }} with {{ param.platform }} {{ param.backend }} {{ editor.version }} on {{ platform.name }} agent: type: Unity::VM::osx - image: package-ci/mac:v1.20.0-1079282 + image: package-ci/macos-12:v4.10.0-1271191 flavor: m1.mac commands: - | @@ -210,7 +208,7 @@ build_{{ package.name }}_{{ param.platform }}_{{ param.backend }}_{{ platform.na - unity-downloader-cli -c Editor -c {{ param.additional_component_arg }} -u {{ editor.version }} --fast -w - curl -s https://artifactory.prd.it.unity3d.com/artifactory/unity-tools/utr-standalone/utr --output utr - chmod +x ./utr - - ./utr --suite=playmode --platform=StandaloneOSX --editor-location=.Editor --testproject=TestProjects/Empty --player-save-path=build/players --architecture=x64 --artifacts_path=build/logs --scripting-backend={{ param.backend }} --build-only --timeout=3000 --testfilter=!HttpSignaling + - ./utr --suite=playmode --platform=StandaloneOSX --editor-location=.Editor --testproject=TestProjects/Empty --player-save-path=build/players --architecture=x64 --artifacts_path=build/logs --scripting-backend={{ param.backend }} --build-only --testfilter=!HttpSignaling artifacts: players: paths: @@ -219,10 +217,10 @@ build_{{ package.name }}_{{ param.platform }}_{{ param.backend }}_{{ platform.na paths: - "build/logs/**" dependencies: - - .yamato/upm-ci-{{ package.name }}-packages.yml#pack_{{ package.name }} + - .yamato/upm-ci-renderstreaming-packages.yml#pack -test_{{ package.name }}_{{ param.platform }}_{{ param.backend }}_{{ platform.name }}_{{ editor.version }}: - name : Test {{ package.packagename }} {{ param.platform }} {{ param.backend }} {{ editor.version }} on {{ platform.name }} +test_{{ packagename }}_{{ param.platform }}_{{ param.backend }}_{{ platform.name }}_{{ editor.version }}: + name : Test {{ package_displayname }} {{ param.platform }} {{ param.backend }} {{ editor.version }} on {{ platform.name }} agent: type: {{ platform.type }} image: {{ platform.image }} @@ -242,17 +240,17 @@ test_{{ package.name }}_{{ param.platform }}_{{ param.backend }}_{{ platform.nam commands: - BuildScripts~/test_package_mac.sh artifacts: - {{ package.name }}_{{ param.backend }}_{{ editor.version }}_{{ platform.name }}_test_results: + {{ packagename }}_{{ param.backend }}_{{ editor.version }}_{{ platform.name }}_test_results: paths: - "upm-ci~/test-results/**" dependencies: - - .yamato/upm-ci-{{ package.name }}-packages.yml#build_{{ package.name }}_{{ param.platform }}_{{ param.backend }}_{{ platform.name }}_{{ editor.version }} + - .yamato/upm-ci-renderstreaming-packages.yml#build_{{ param.platform }}_{{ param.backend }}_{{ platform.name }}_{{ editor.version }} - .yamato/upm-ci-webapp.yml#pack_{{ platform.packed_webapp_platform }} {% else %} # platform.name == "macos" or platform.name == "macos-m1" and param.platform != "standalone" -test_{{ package.name }}_{{ param.platform }}_{{ param.backend }}_{{ platform.name }}_{{ editor.version }}: - name : Test {{ package.packagename }} {{ param.platform }} {{ param.backend }} {{ editor.version }} on {{ platform.name }} +test_{{ packagename }}_{{ param.platform }}_{{ param.backend }}_{{ platform.name }}_{{ editor.version }}: + name : Test {{ package_displayname }} {{ param.platform }} {{ param.backend }} {{ editor.version }} on {{ platform.name }} agent: type: {{ platform.type }} image: {{ platform.image }} @@ -269,16 +267,16 @@ test_{{ package.name }}_{{ param.platform }}_{{ param.backend }}_{{ platform.nam TEST_ARCHITECTURE: {{ platform.architecture }} SCRIPTING_BACKEND: {{ param.backend }} EDITOR_VERSION: {{ editor.version }} - EXTRA_UTR_ARG: --timeout=3000 --testfilter=!HttpSignaling + EXTRA_UTR_ARG: --testfilter=!HttpSignaling commands: - find upm-ci~/packages/ -name "*.tgz" | xargs -I file tar xvf file -C upm-ci~ - BuildScripts~/test_package_mac.sh artifacts: - {{ package.name }}_{{ param.backend }}_{{ editor.version }}_{{ platform.name }}_test_results: + {{ packagename }}_{{ param.backend }}_{{ editor.version }}_{{ platform.name }}_test_results: paths: - "upm-ci~/test-results/**" dependencies: - - .yamato/upm-ci-renderstreaming-packages.yml#pack_{{ package.name }} + - .yamato/upm-ci-renderstreaming-packages.yml#pack - .yamato/upm-ci-webapp.yml#pack_{{ platform.packed_webapp_platform }} {% endif %} @@ -301,33 +299,34 @@ test_{{ project.name }}_{{ param.platform }}_{{ param.backend }}_{{ platform.nam TEST_PLATFORM: {{ param.platform }} SCRIPTING_BACKEND: {{ param.backend }} EDITOR_VERSION: {{ editor.version }} - EXTRA_UTR_ARG: --timeout=3000 --testfilter=!HttpSignaling + EXTRA_UTR_ARG: --testfilter=!HttpSignaling commands: - - find ./{{ package.packagename }} -type l -exec bash -c 'sh BuildScripts~/convert_symlinks.sh "$0"' {} \; + - find ./{{ packagename }} -type l -exec bash -c 'sh BuildScripts~/convert_symlinks.sh "$0"' {} \; - BuildScripts~/test_package_mac.sh artifacts: - {{ package.name }}_{{ editor.version }}_{{ platform.name }}_test_results: + {{ packagename }}_{{ editor.version }}_{{ platform.name }}_test_results: paths: - "upm-ci~/test-results/**" dependencies: - .yamato/upm-ci-webapp.yml#pack_{{ platform.packed_webapp_platform }} {% endfor %} {% endfor %} -{% endif -%} +{% endif %} {% endfor %} -trigger_test_{{ package.name }}_{{ editor.version }}: - name : Trigger test {{ package.packagename }} {{ editor.version }} all platforms +trigger_test_{{ packagename }}_{{ editor.version }}: + name : Trigger test {{ package_displayname }} {{ editor.version }} all platforms dependencies: - - .yamato/upm-ci-{{ package.name }}-packages.yml#test_{{ package.name }}_{{ editor.version }} + - .yamato/upm-ci-renderstreaming-packages.yml#test_{{ packagename }}_{{ editor.version }} {% if editor.version == "2020.3" -%} triggers: - expression: pull_request.target eq "develop" -{% endif -%} + expression: pull_request.target eq "main" +{% endif %} -test_{{ package.name }}_{{ editor.version }}: - name : Test {{ package.packagename }} {{ editor.version }} all platforms +test_{{ packagename }}_{{ editor.version }}: + name : Test {{ package_displayname }} {{ editor.version }} all platforms dependencies: + - .yamato/format.yml#check_formatting_dotnet-format {% for platform in platforms %} {% for param in platform.test_params %} # todo(kazuki) : @@ -335,116 +334,78 @@ test_{{ package.name }}_{{ editor.version }}: # XCode command line tools has not installed on m1 mac device (Standalone test don't need to install them) {% if platform.name == "macos-m1" %} {% if param.platform == "standalone" %} - - .yamato/upm-ci-{{ package.name }}-packages.yml#test_{{ package.name }}_{{ param.platform }}_{{ param.backend }}_{{ platform.name }}_{{ editor.version }} + - .yamato/upm-ci-renderstreaming-packages.yml#test_{{ packagename }}_{{ param.platform }}_{{ param.backend }}_{{ platform.name }}_{{ editor.version }} {% endif %} {% else %} - - .yamato/upm-ci-{{ package.name }}-packages.yml#test_{{ package.name }}_{{ param.platform }}_{{ param.backend }}_{{ platform.name }}_{{ editor.version }} + - .yamato/upm-ci-renderstreaming-packages.yml#test_{{ packagename }}_{{ param.platform }}_{{ param.backend }}_{{ platform.name }}_{{ editor.version }} {% endif %} {% endfor %} {% endfor %} - - .yamato/upm-ci-{{ package.name }}-packages.yml#test_{{ package.name }}_{{ editor.version }}_ios + - .yamato/upm-ci-renderstreaming-packages.yml#test_{{ packagename }}_{{ editor.version }}_ios {% for target in test_targets_android %} -# todo: Exclude tests for Unity 2022.1 on Android platform because it is instable. -{% if editor.version != "2022.1" %} - - .yamato/upm-ci-{{ package.name }}-packages.yml#test_{{ package.name }}_{{ editor.version }}_android_{{ target.name }} -{% endif %} + - .yamato/upm-ci-renderstreaming-packages.yml#test_{{ packagename }}_{{ editor.version }}_android_{{ target.name }} {% endfor %} -test_renderpipeline_{{ package.name }}_{{ editor.version }}: - name : test {{ package.packagename }} {{ editor.version }} all RenderPipeline +test_renderpipeline_{{ packagename }}_{{ editor.version }}: + name : Test {{ package_displayname }} {{ editor.version }} all RenderPipeline dependencies: {% for platform in platforms %} {% for param in platform.test_params %} {% for project in test_projects %} - - .yamato/upm-ci-{{ package.name }}-packages.yml#test_{{ project.name }}_{{ param.platform }}_{{ param.backend }}_{{ platform.name }}_{{ editor.version }} + - .yamato/upm-ci-renderstreaming-packages.yml#test_{{ project.name }}_{{ param.platform }}_{{ param.backend }}_{{ platform.name }}_{{ editor.version }} {% endfor %} {% endfor %} {% endfor %} {% endfor %} -publish_dry_run_{{ package.name }}: - name: Publish Dry Run {{ package.packagename }} +publish_dry_run_{{ packagename }}: + name: Publish Dry Run {{ package_displayname }} agent: type: Unity::VM - image: package-ci/win10:v1.21.0-1103459 + image: package-ci/win10:v4 flavor: b1.large commands: - npm install upm-ci-utils@{{ upm.package_version }} -g --registry {{ upm.registry_url }} - - upm-ci package publish --dry-run --package-path {{ package.packagename }} + - upm-ci package publish --dry-run --package-path {{ packagename }} triggers: tags: only: - /^(r|R)(c|C)-\d+\.\d+\.\d+(-preview(\.\d+)?)?$/ artifacts: - {{ package.name }}_artifacts.zip: + {{ packagename }}_artifacts.zip: paths: - "upm-ci~/packages/*.tgz" dependencies: - - .yamato/upm-ci-renderstreaming-packages.yml#pack_{{ package.name }} + - .yamato/upm-ci-renderstreaming-packages.yml#pack {% for editor in editors %} {% if editor.version != "trunk" -%} # exclude trunk to test - - .yamato/upm-ci-renderstreaming-packages.yml#test_{{ package.name }}_editmode_mono_win_{{ editor.version }} - - .yamato/upm-ci-renderstreaming-packages.yml#test_{{ package.name }}_editmode_mono_macos_{{ editor.version }} - - .yamato/upm-ci-renderstreaming-packages.yml#test_{{ package.name }}_editmode_mono_linux_{{ editor.version }} + - .yamato/upm-ci-renderstreaming-packages.yml#test_{{ packagename }}_editmode_mono_win-gpu_{{ editor.version }} + - .yamato/upm-ci-renderstreaming-packages.yml#test_{{ packagename }}_editmode_mono_macos_{{ editor.version }} + - .yamato/upm-ci-renderstreaming-packages.yml#test_{{ packagename }}_editmode_mono_linux-gpu_{{ editor.version }} {% endif %} {% endfor %} -publish_{{ package.name }}: - name: Publish {{ package.packagename }} +publish_{{ packagename }}: + name: Publish {{ package_displayname }} agent: type: Unity::VM - image: package-ci/win10:v1.21.0-1103459 + image: package-ci/win10:v4 flavor: b1.large commands: - npm install upm-ci-utils@{{ upm.package_version }} -g --registry {{ upm.registry_url }} - - upm-ci package publish --package-path {{ package.packagename }} + - upm-ci package publish --package-path {{ packagename }} triggers: tags: only: - /^(r|R)(c|C)-\d+\.\d+\.\d+(-preview(\.\d+)?)?$/ artifacts: - {{ package.name }}_artifacts.zip: + {{ packagename }}_artifacts.zip: paths: - "upm-ci~/packages/*.tgz" dependencies: - - .yamato/upm-ci-renderstreaming-packages.yml#pack_{{ package.name }} + - .yamato/upm-ci-renderstreaming-packages.yml#pack {% for editor in editors %} {% if editor.version != "trunk" %} # exclude trunk to test - - .yamato/upm-ci-renderstreaming-packages.yml#trigger_test_{{ package.name }}_{{ editor.version }} + - .yamato/upm-ci-renderstreaming-packages.yml#trigger_test_{{ packagename }}_{{ editor.version }} {% endif %} {% endfor %} - -{% for platform in platforms %} -{% if platform.name != "macos" and platform.name != "macos-m1" %} -{% for editor in editors %} -codecoverage_{{ package.packagename }}_{{ platform.name }}_{{ editor.version }}: - name: Code coverage {{ package.packagename }} {{ platform.name }} {{ editor.version }} - agent: - type: {{ platform.type }} - image: {{ platform.image }} - flavor: {{ platform.flavor }} - commands: - - pip config set global.index-url https://artifactory.prd.it.unity3d.com/artifactory/api/pypi/pypi/simple - - pip install unity-downloader-cli --index-url https://artifactory.prd.it.unity3d.com/artifactory/api/pypi/pypi/simple - - npm install upm-ci-utils@{{ upm.package_version }} -g --registry {{ upm.registry_url }} -{% if platform.name == "win" %} - - | - set WEBAPP_PATH=%cd%\Webapp\bin~\{{ platform.packed_webapp_name }} - upm-ci package test -u {{ editor.version }} --package-path {{ package.packagename }} --enable-code-coverage --code-coverage-options "generateAdditionalMetrics;generateHtmlReport;generateBadgeReport;assemblyFilters:-UnityEngine.*,+Unity.RenderStreaming" --extra-utr-arg="--timeout=3000" -{% else %} - - | - export WEBAPP_PATH=$(pwd)/WebApp/bin~/{{ platform.packed_webapp_name }} - upm-ci package test -u {{ editor.version }} --package-path {{ package.packagename }} --enable-code-coverage --code-coverage-options "generateAdditionalMetrics;generateHtmlReport;generateBadgeReport;assemblyFilters:-UnityEngine.*,+Unity.RenderStreaming" --extra-utr-arg="--timeout=3000" -{% endif %} - artifacts: - {{ package.name }}_{{ editor.version }}_{{ platform.name }}_coverage_results: - paths: - - "upm-ci~/test-results/**" - dependencies: - - .yamato/upm-ci-renderstreaming-packages.yml#pack_{{ package.name }} - - .yamato/upm-ci-webapp.yml#pack_{{ platform.packed_webapp_platform }} -{% endfor %} -{% endif %} -{% endfor %} - -{% endfor %} diff --git a/.yamato/upm-ci-template.yml b/.yamato/upm-ci-template.yml index 828256740..ac69dc318 100644 --- a/.yamato/upm-ci-template.yml +++ b/.yamato/upm-ci-template.yml @@ -1,17 +1,17 @@ -# .yamato/upm-ci-template.yml {% metadata_file .yamato/package.metafile %} --- + {% for project in template_projects %} {% for editor in editors %} -{% if editor.version == "2020.3" -%} +{% if editor.version == "2020.3" %} prepack_{{ project.name }}_{{ editor.version }}: name: Pre-Pack {{ project.packagename }} {{ editor.version }} - Primed Artifacts agent: type: Unity::VM - image: package-ci/win10:v1.21.0-1103459 + image: package-ci/win10:v4 flavor: b1.large commands: - pip install unity-downloader-cli --index-url {{ intra_pypi_url }} --upgrade @@ -44,7 +44,7 @@ pack_{{ project.name }}_{{ editor.version }}: - "upm-ci~/**/*" {% for platform in platforms %} -{% if platform.name == "win" -%} +{% if platform.name == "win" or platform.name == "win-gpu" %} {% for param in platform.test_params %} test_{{ project.name }}_{{ param.platform }}_{{ param.backend }}_{{ platform.name }}_{{ editor.version }}: name : Test {{ project.packagename }} {{ param.platform }} {{ param.backend }} {{ editor.version }} on {{ platform.name }} @@ -66,9 +66,9 @@ test_{{ project.name }}_{{ param.platform }}_{{ param.backend }}_{{ platform.nam - .yamato/upm-ci-template.yml#pack_{{ project.name }}_{{ editor.version }} - .yamato/upm-ci-webapp.yml#pack_{{ platform.name }} {% endfor %} -{% else -%} +{% else %} {% for param in platform.test_params %} -{% if project.name != "renderstreaming-rtx" -%} +{% if project.name != "renderstreaming-rtx" %} test_{{ project.name }}_{{ param.platform }}_{{ param.backend }}_{{ platform.name }}_{{ editor.version }}: name : Test {{ project.packagename }} {{ param.platform }} {{ param.backend }} {{ editor.version }} on {{ platform.name }} agent: @@ -85,36 +85,36 @@ test_{{ project.name }}_{{ param.platform }}_{{ param.backend }}_{{ platform.nam dependencies: - .yamato/upm-ci-template.yml#pack_{{ project.name }}_{{ editor.version }} - .yamato/upm-ci-webapp.yml#pack_{{ platform.name }} -{% endif -%} +{% endif %} {% endfor %} -{% endif -%} +{% endif %} {% endfor %} trigger_template_test_{{ project.name }}_{{ editor.version }}: name : Trigger all Template test {{ project.packagename }} {{ editor.version }} dependencies: {% for platform in platforms %} - {% if platform.name == "win" -%} + {% if platform.name == "win" or platform.name == "win-gpu" %} {% for param in platform.test_params %} - .yamato/upm-ci-template.yml#test_{{ project.name }}_{{ param.platform }}_{{ param.backend }}_{{ platform.name }}_{{ editor.version }} {% endfor %} - {% else -%} + {% else %} {% if project.name != "renderstreaming-rtx" %} {% for param in platform.test_params %} - .yamato/upm-ci-template.yml#test_{{ project.name }}_{{ param.platform }}_{{ param.backend }}_{{ platform.name }}_{{ editor.version }} {% endfor %} {% endif %} - {% endif -%} + {% endif %} {% endfor %} -{% endif -%} +{% endif %} {% endfor %} publish_{{ project.name }}: name: Publish {{ project.packagename }} agent: type: Unity::VM - image: package-ci/win10:v1.21.0-1103459 + image: package-ci/win10:v4 flavor: b1.large commands: - npm install upm-ci-utils@{{ upm.package_version }} -g --registry {{ upm.registry_url }} @@ -143,7 +143,7 @@ publish_dryrun_{{ project.name }}: name: Publish Dry Run {{ project.packagename }} agent: type: Unity::VM - image: package-ci/win10:v1.21.0-1103459 + image: package-ci/win10:v4 flavor: b1.large commands: - npm install upm-ci-utils@{{ upm.package_version }} -g --registry {{ upm.registry_url }} diff --git a/.yamato/upm-ci-webapp.yml b/.yamato/upm-ci-webapp.yml index 5876fffbe..24bf1427d 100644 --- a/.yamato/upm-ci-webapp.yml +++ b/.yamato/upm-ci-webapp.yml @@ -1,14 +1,14 @@ platforms: - name: win type: Unity::VM - image: package-ci/win10:v1.21.0-1103459 + image: package-ci/win10:v4 flavor: b1.xlarge pack_command: pack_webapp.cmd test_command: test_webapp.cmd client_test_command: test_webapp_client.cmd - name: macos type: Unity::VM::osx - image: package-ci/mac:v1.20.0-1079282 + image: package-ci/macos-12:v4.10.0-1271191 flavor: m1.mac pack_command: ./pack_webapp.sh test_command: ./test_webapp.sh @@ -77,11 +77,11 @@ test_client_{{ platform.name }}: trigger_webapp_test_{{ project.name }}: name : Trigger all WebApp test {{ project.packagename }} triggers: - expression: pull_request.target eq "develop" + expression: pull_request.target eq "main" dependencies: {% for platform in platforms %} - .yamato/upm-ci-webapp.yml#test_{{ platform.name }} - .yamato/upm-ci-webapp.yml#test_client_{{ platform.name }} {% endfor %} -{% endfor %} \ No newline at end of file +{% endfor %} diff --git a/README.md b/README.md index 0ee17c2fa..21de4644e 100644 --- a/README.md +++ b/README.md @@ -2,7 +2,7 @@ unity 2020.3 unity 2021.3 -unity 2022.1 +unity 2022.3 **Unity Render Streaming** is a solution that provides Unity's high quality rendering abilities via browser. It's designed to meet the needs of tasks like viewing car configurators or architectural models on mobile devices. This solution's streaming technology takes advantage of [WebRTC](https://webrtc.org/), and developers can even use the [WebRTC package](https://docs.unity3d.com/Packages/com.unity.webrtc@latest) to create their own unique solutions. @@ -13,13 +13,6 @@ This solution's streaming technology takes advantage of [WebRTC](https://webrtc. Please see [Requirements](com.unity.renderstreaming/Documentation~/index.md#requirements) section. -### Furioos compatibility - -**Unity Render Streaming** is also supported natively by **Furioos** platform https://www.furioos.com/ . -That means that you can easily build a Unity application, upload it on **Furioos** and enjoy all the features of **Unity Render Streaming** without worrying about the deployment and scalability issues of your project. - -Please see [Furioos Tutorial](com.unity.renderstreaming/Documentation~/deploy-to-furioos) section to find out how it works. - ### License - `com.unity.renderstreaming` - [LICENSE.md](com.unity.renderstreaming/LICENSE.md) @@ -55,7 +48,10 @@ Please see [Furioos Tutorial](com.unity.renderstreaming/Documentation~/deploy-to | `3.1.0-exp.2` | - Audio Renderer support
- Multiplay sample
- M1 Mac support | Dec 2021 | | `3.1.0-exp.3` | - Fix bugs | Feb 2022 | | `3.1.0-exp.4` | - Streaming settings API
- *Unity 2022.1* support
- Remove *Unity 2019.4* from support list | Oct 2022 | -| `3.1.0-exp.5` | - Streaming Settings Window
- Auto Configuration | Dec 2022 | +| `3.1.0-exp.5` | - Fix bugs | Jan 2023 | +| `3.1.0-exp.6` | - Streaming Settings Window
- Auto Configuration
- Command line option | Feb 2023 | +| `3.1.0-exp.7` | - Fix bugs | Jul 2023 | +| `3.1.0-exp.8` | - Fix bugs | Nov 2023 | ## FAQ diff --git a/RenderStreaming~/Packages/manifest.json b/RenderStreaming~/Packages/manifest.json index fedbd0d82..749281cc3 100644 --- a/RenderStreaming~/Packages/manifest.json +++ b/RenderStreaming~/Packages/manifest.json @@ -1,14 +1,15 @@ { "dependencies": { - "com.unity.ide.rider": "3.0.15", - "com.unity.ide.visualstudio": "2.0.16", + "com.unity.ide.rider": "3.0.24", + "com.unity.ide.visualstudio": "2.0.18", "com.unity.ide.vscode": "1.2.5", "com.unity.test-framework": "1.1.33", - "com.unity.testtools.codecoverage": "1.2.0-exp.7", + "com.unity.testtools.codecoverage": "1.2.4", "com.unity.ugui": "1.0.0", - "com.unity.xr.arcore": "4.2.3", - "com.unity.xr.arfoundation": "4.2.3", - "com.unity.xr.arkit": "4.2.3", + "com.unity.xr.arcore": "5.0.6", + "com.unity.xr.arfoundation": "5.0.6", + "com.unity.xr.arkit": "5.0.6", + "com.unity.xr.management": "4.3.3", "com.unity.modules.androidjni": "1.0.0", "com.unity.modules.animation": "1.0.0", "com.unity.modules.audio": "1.0.0", @@ -16,10 +17,6 @@ "com.unity.modules.physics": "1.0.0", "com.unity.modules.screencapture": "1.0.0", "com.unity.modules.ui": "1.0.0", - "com.unity.modules.uielements": "1.0.0", - "com.unity.modules.unitywebrequest": "1.0.0" - }, - "testables": [ - "com.unity.inputsystem" - ] + "com.unity.modules.uielements": "1.0.0" + } } diff --git a/RenderStreaming~/Packages/packages-lock.json b/RenderStreaming~/Packages/packages-lock.json index 1c58803ed..0a41adf92 100644 --- a/RenderStreaming~/Packages/packages-lock.json +++ b/RenderStreaming~/Packages/packages-lock.json @@ -15,7 +15,7 @@ "url": "https://packages.unity.com" }, "com.unity.ide.rider": { - "version": "3.0.15", + "version": "3.0.24", "depth": 0, "source": "registry", "dependencies": { @@ -24,7 +24,7 @@ "url": "https://packages.unity.com" }, "com.unity.ide.visualstudio": { - "version": "2.0.16", + "version": "2.0.18", "depth": 0, "source": "registry", "dependencies": { @@ -40,7 +40,7 @@ "url": "https://packages.unity.com" }, "com.unity.inputsystem": { - "version": "1.4.2", + "version": "1.7.0", "depth": 1, "source": "registry", "dependencies": { @@ -48,13 +48,22 @@ }, "url": "https://packages.unity.com" }, + "com.unity.mathematics": { + "version": "1.2.6", + "depth": 1, + "source": "registry", + "dependencies": {}, + "url": "https://packages.unity.com" + }, "com.unity.renderstreaming": { "version": "file:com.unity.renderstreaming", "depth": 0, "source": "embedded", "dependencies": { - "com.unity.webrtc": "2.4.0-exp.11", - "com.unity.inputsystem": "1.4.1" + "com.unity.webrtc": "3.0.0-pre.7", + "com.unity.inputsystem": "1.5.1", + "com.unity.ugui": "1.0.0", + "com.unity.modules.screencapture": "1.0.0" } }, "com.unity.settings-manager": { @@ -64,15 +73,6 @@ "dependencies": {}, "url": "https://packages.unity.com" }, - "com.unity.subsystemregistration": { - "version": "1.1.0", - "depth": 2, - "source": "registry", - "dependencies": { - "com.unity.modules.subsystems": "1.0.0" - }, - "url": "https://packages.unity.com" - }, "com.unity.test-framework": { "version": "1.1.33", "depth": 0, @@ -85,7 +85,7 @@ "url": "https://packages.unity.com" }, "com.unity.testtools.codecoverage": { - "version": "1.2.0-exp.7", + "version": "1.2.4", "depth": 0, "source": "registry", "dependencies": { @@ -104,21 +104,23 @@ } }, "com.unity.webrtc": { - "version": "2.4.0-exp.11", + "version": "3.0.0-pre.7", "depth": 1, "source": "registry", "dependencies": { "com.unity.modules.jsonserialize": "1.0.0", - "com.unity.editorcoroutines": "1.0.0" + "com.unity.editorcoroutines": "1.0.0", + "com.unity.modules.audio": "1.0.0" }, "url": "https://packages.unity.com" }, "com.unity.xr.arcore": { - "version": "4.2.3", + "version": "5.0.6", "depth": 0, "source": "registry", "dependencies": { - "com.unity.xr.arsubsystems": "4.2.3", + "com.unity.xr.arfoundation": "5.0.6", + "com.unity.xr.core-utils": "2.1.0", "com.unity.xr.management": "4.0.1", "com.unity.modules.androidjni": "1.0.0", "com.unity.modules.unitywebrequest": "1.0.0" @@ -126,40 +128,46 @@ "url": "https://packages.unity.com" }, "com.unity.xr.arfoundation": { - "version": "4.2.3", + "version": "5.0.6", "depth": 0, "source": "registry", "dependencies": { - "com.unity.xr.arsubsystems": "4.2.3", + "com.unity.inputsystem": "1.3.0", + "com.unity.xr.core-utils": "2.1.0", "com.unity.xr.management": "4.0.1", - "com.unity.modules.particlesystem": "1.0.0" + "com.unity.ugui": "1.0.0", + "com.unity.mathematics": "1.2.5", + "com.unity.modules.particlesystem": "1.0.0", + "com.unity.modules.ui": "1.0.0", + "com.unity.modules.unityanalytics": "1.0.0", + "com.unity.modules.unitywebrequest": "1.0.0" }, "url": "https://packages.unity.com" }, "com.unity.xr.arkit": { - "version": "4.2.3", + "version": "5.0.6", "depth": 0, "source": "registry", "dependencies": { "com.unity.editorcoroutines": "1.0.0", - "com.unity.xr.arsubsystems": "4.2.3", + "com.unity.xr.arfoundation": "5.0.6", + "com.unity.xr.core-utils": "2.1.0", "com.unity.xr.management": "4.0.1" }, "url": "https://packages.unity.com" }, - "com.unity.xr.arsubsystems": { - "version": "4.2.3", + "com.unity.xr.core-utils": { + "version": "2.2.3", "depth": 1, "source": "registry", "dependencies": { - "com.unity.subsystemregistration": "1.1.0", - "com.unity.xr.management": "4.0.1" + "com.unity.modules.xr": "1.0.0" }, "url": "https://packages.unity.com" }, "com.unity.xr.legacyinputhelpers": { "version": "2.1.10", - "depth": 2, + "depth": 1, "source": "registry", "dependencies": { "com.unity.modules.vr": "1.0.0", @@ -168,15 +176,14 @@ "url": "https://packages.unity.com" }, "com.unity.xr.management": { - "version": "4.2.0", - "depth": 1, + "version": "4.3.3", + "depth": 0, "source": "registry", "dependencies": { "com.unity.modules.subsystems": "1.0.0", "com.unity.modules.vr": "1.0.0", "com.unity.modules.xr": "1.0.0", - "com.unity.xr.legacyinputhelpers": "2.1.7", - "com.unity.subsystemregistration": "1.0.6" + "com.unity.xr.legacyinputhelpers": "2.1.7" }, "url": "https://packages.unity.com" }, @@ -238,7 +245,7 @@ }, "com.unity.modules.subsystems": { "version": "1.0.0", - "depth": 2, + "depth": 1, "source": "builtin", "dependencies": { "com.unity.modules.jsonserialize": "1.0.0" @@ -271,15 +278,24 @@ "com.unity.modules.jsonserialize": "1.0.0" } }, + "com.unity.modules.unityanalytics": { + "version": "1.0.0", + "depth": 1, + "source": "builtin", + "dependencies": { + "com.unity.modules.unitywebrequest": "1.0.0", + "com.unity.modules.jsonserialize": "1.0.0" + } + }, "com.unity.modules.unitywebrequest": { "version": "1.0.0", - "depth": 0, + "depth": 1, "source": "builtin", "dependencies": {} }, "com.unity.modules.vr": { "version": "1.0.0", - "depth": 2, + "depth": 1, "source": "builtin", "dependencies": { "com.unity.modules.jsonserialize": "1.0.0", @@ -289,7 +305,7 @@ }, "com.unity.modules.xr": { "version": "1.0.0", - "depth": 2, + "depth": 1, "source": "builtin", "dependencies": { "com.unity.modules.physics": "1.0.0", diff --git a/RenderStreaming~/ProjectSettings/EditorBuildSettings.asset b/RenderStreaming~/ProjectSettings/EditorBuildSettings.asset index 4b03cfbe4..7d365256b 100644 --- a/RenderStreaming~/ProjectSettings/EditorBuildSettings.asset +++ b/RenderStreaming~/ProjectSettings/EditorBuildSettings.asset @@ -42,5 +42,9 @@ EditorBuildSettings: type: 2} com.unity.input.settings: {fileID: 11400000, guid: 9d3afefa5e1574ee38fb1d298122dbc7, type: 2} + com.unity.renderstreaming.settings: {fileID: 11400000, guid: 039337c008e9a5c44a60f957eae3e450, + type: 2} + com.unity.xr.arfoundation.simulation_settings: {fileID: 11400000, guid: 0ec671069889a6541b317d5976884498, + type: 2} com.unity.xr.management.loader_settings: {fileID: 11400000, guid: 66105b57eda77e74db55e7eb2b532054, type: 2} diff --git a/RenderStreaming~/ProjectSettings/ProjectSettings.asset b/RenderStreaming~/ProjectSettings/ProjectSettings.asset index dfab294c3..0010d00d0 100644 --- a/RenderStreaming~/ProjectSettings/ProjectSettings.asset +++ b/RenderStreaming~/ProjectSettings/ProjectSettings.asset @@ -149,7 +149,6 @@ PlayerSettings: enable360StereoCapture: 0 isWsaHolographicRemotingEnabled: 0 enableFrameTimingStats: 0 - enableOpenGLProfilerGPURecorders: 1 useHDRDisplay: 0 D3DHDRBitDepth: 0 m_ColorGamuts: 00000000 @@ -175,7 +174,7 @@ PlayerSettings: stripEngineCode: 0 iPhoneStrippingLevel: 0 iPhoneScriptCallOptimization: 0 - ForceInternetPermission: 0 + ForceInternetPermission: 1 ForceSDCardPermission: 0 CreateWallpaper: 0 APKExpansionFiles: 0 @@ -224,7 +223,6 @@ PlayerSettings: iOSLaunchScreeniPadCustomStoryboardPath: iOSDeviceRequirements: [] iOSURLSchemes: [] - macOSURLSchemes: [] iOSBackgroundModes: 0 iOSMetalForceHardShadows: 0 metalEditorSupport: 1 @@ -449,7 +447,6 @@ PlayerSettings: m_BuildTargetGroupLightmapEncodingQuality: [] m_BuildTargetGroupLightmapSettings: [] m_BuildTargetNormalMapEncoding: [] - m_BuildTargetDefaultTextureCompressionFormat: [] playModeTestRunnerEnabled: 0 runPlayModeTestAsEditModeTest: 0 actionOnDotNetUnhandledException: 1 @@ -468,7 +465,6 @@ PlayerSettings: switchScreenResolutionBehavior: 2 switchUseCPUProfiler: 0 switchUseGOLDLinker: 0 - switchLTOSetting: 0 switchApplicationID: 0x01004b9000490000 switchNSODependencies: switchTitleNames_0: @@ -598,6 +594,7 @@ PlayerSettings: switchNetworkInterfaceManagerInitializeEnabled: 1 switchPlayerConnectionEnabled: 1 switchUseNewStyleFilepaths: 0 + switchUseLegacyFmodPriorities: 1 switchUseMicroSleepForYield: 1 switchEnableRamDiskSupport: 0 switchMicroSleepForYieldTime: 25 @@ -708,6 +705,7 @@ PlayerSettings: suppressCommonWarnings: 1 allowUnsafeCode: 0 useDeterministicCompilation: 1 + useReferenceAssemblies: 1 enableRoslynAnalyzers: 1 additionalIl2CppArgs: scriptingRuntimeVersion: 1 @@ -788,6 +786,7 @@ PlayerSettings: m_VersionName: apiCompatibilityLevel: 6 activeInputHandler: 1 + windowsGamepadBackendHint: 0 cloudProjectId: framebufferDepthMemorylessMode: 0 qualitySettingsNames: [] @@ -795,6 +794,4 @@ PlayerSettings: organizationId: cloudEnabled: 0 legacyClampBlendShapeWeights: 0 - playerDataPath: - forceSRGBBlit: 1 virtualTexturingSupportEnabled: 0 diff --git a/RenderStreaming~/ProjectSettings/ProjectVersion.txt b/RenderStreaming~/ProjectSettings/ProjectVersion.txt index 8ea1b855a..9706d869a 100644 --- a/RenderStreaming~/ProjectSettings/ProjectVersion.txt +++ b/RenderStreaming~/ProjectSettings/ProjectVersion.txt @@ -1,2 +1,2 @@ -m_EditorVersion: 2021.3.11f1 -m_EditorVersionWithRevision: 2021.3.11f1 (0a5ca18544bf) +m_EditorVersion: 2021.3.31f1 +m_EditorVersionWithRevision: 2021.3.31f1 (3409e2af086f) diff --git a/RenderStreaming~/ProjectSettings/RenderStreamingProjectSettings.asset b/RenderStreaming~/ProjectSettings/RenderStreamingProjectSettings.asset new file mode 100644 index 000000000..cdd22c0ce --- /dev/null +++ b/RenderStreaming~/ProjectSettings/RenderStreamingProjectSettings.asset @@ -0,0 +1,16 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!114 &1 +MonoBehaviour: + m_ObjectHideFlags: 61 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 0} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: b4f5b5e9819c4eafb84bd87d1c2f266f, type: 3} + m_Name: + m_EditorClassIdentifier: + m_WizardPopupAtStart: 0 + m_WizardPopupAlreadyShownOnce: 1 diff --git a/TestProjects/Empty/Assets/Editor.meta b/TestProjects/Empty/Assets/Editor.meta new file mode 100644 index 000000000..59e70b1fc --- /dev/null +++ b/TestProjects/Empty/Assets/Editor.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: ff4235c650c6444a9bfcdff2322a547a +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/TestProjects/Empty/Assets/Editor/PostProcess.cs b/TestProjects/Empty/Assets/Editor/PostProcess.cs new file mode 100644 index 000000000..afdcea08d --- /dev/null +++ b/TestProjects/Empty/Assets/Editor/PostProcess.cs @@ -0,0 +1,40 @@ +using UnityEditor; +using UnityEditor.Build; +using UnityEditor.Build.Reporting; +#if UNITY_IOS +using UnityEditor.iOS.Xcode; +#endif + +class PostProcess : IPostprocessBuildWithReport +{ + public int callbackOrder { get { return 0; } } + + public void OnPostprocessBuild(BuildReport report) + { +#if UNITY_IOS + if (report.summary.platform == BuildTarget.iOS) + { + string projectPath = report.summary.outputPath + "/Unity-iPhone.xcodeproj/project.pbxproj"; + + PBXProject pbxProject = new PBXProject(); + pbxProject.ReadFromFile(projectPath); + + //Disabling Bitcode on all targets + + //Main + string target = pbxProject.GetUnityMainTargetGuid(); + pbxProject.SetBuildProperty(target, "ENABLE_BITCODE", "NO"); + + //Unity Tests + target = pbxProject.TargetGuidByName(PBXProject.GetUnityTestTargetName()); + pbxProject.SetBuildProperty(target, "ENABLE_BITCODE", "NO"); + + //Unity Framework + target = pbxProject.GetUnityFrameworkTargetGuid(); + pbxProject.SetBuildProperty(target, "ENABLE_BITCODE", "NO"); + + pbxProject.WriteToFile(projectPath); + } +#endif + } +} diff --git a/com.unity.renderstreaming/Editor/RenderStreamingMenu.cs.meta b/TestProjects/Empty/Assets/Editor/PostProcess.cs.meta similarity index 83% rename from com.unity.renderstreaming/Editor/RenderStreamingMenu.cs.meta rename to TestProjects/Empty/Assets/Editor/PostProcess.cs.meta index cfa5dfd95..c0f431468 100644 --- a/com.unity.renderstreaming/Editor/RenderStreamingMenu.cs.meta +++ b/TestProjects/Empty/Assets/Editor/PostProcess.cs.meta @@ -1,5 +1,5 @@ fileFormatVersion: 2 -guid: 12f537a158c855d4fa65dd091ad15a7e +guid: 40f483dfdb21e42c697cf1fd36e61c0c MonoImporter: externalObjects: {} serializedVersion: 2 diff --git a/TestProjects/Empty/Packages/manifest.json b/TestProjects/Empty/Packages/manifest.json index 7040b5701..eea30cd49 100644 --- a/TestProjects/Empty/Packages/manifest.json +++ b/TestProjects/Empty/Packages/manifest.json @@ -1,9 +1,9 @@ { "dependencies": { "com.unity.renderstreaming": "file:../../../com.unity.renderstreaming", - "com.unity.test-framework": "1.1.31", + "com.unity.test-framework": "1.1.33", "com.unity.textmeshpro": "3.0.6", - "com.unity.timeline": "1.6.4", + "com.unity.timeline": "1.7.5", "com.unity.ugui": "1.0.0", "com.unity.modules.ai": "1.0.0", "com.unity.modules.androidjni": "1.0.0", diff --git a/TestProjects/Empty/Packages/packages-lock.json b/TestProjects/Empty/Packages/packages-lock.json index 2e60e3071..f962d323e 100644 --- a/TestProjects/Empty/Packages/packages-lock.json +++ b/TestProjects/Empty/Packages/packages-lock.json @@ -15,7 +15,7 @@ "url": "https://packages.unity.com" }, "com.unity.inputsystem": { - "version": "1.4.2", + "version": "1.7.0", "depth": 1, "source": "registry", "dependencies": { @@ -28,12 +28,14 @@ "depth": 0, "source": "local", "dependencies": { - "com.unity.webrtc": "2.4.0-exp.11", - "com.unity.inputsystem": "1.4.1" + "com.unity.webrtc": "3.0.0-pre.7", + "com.unity.inputsystem": "1.5.1", + "com.unity.ugui": "1.0.0", + "com.unity.modules.screencapture": "1.0.0" } }, "com.unity.test-framework": { - "version": "1.1.31", + "version": "1.1.33", "depth": 0, "source": "registry", "dependencies": { @@ -53,7 +55,7 @@ "url": "https://packages.unity.com" }, "com.unity.timeline": { - "version": "1.6.4", + "version": "1.7.5", "depth": 0, "source": "registry", "dependencies": { @@ -74,12 +76,13 @@ } }, "com.unity.webrtc": { - "version": "2.4.0-exp.11", + "version": "3.0.0-pre.7", "depth": 1, "source": "registry", "dependencies": { "com.unity.modules.jsonserialize": "1.0.0", - "com.unity.editorcoroutines": "1.0.0" + "com.unity.editorcoroutines": "1.0.0", + "com.unity.modules.audio": "1.0.0" }, "url": "https://packages.unity.com" }, @@ -215,17 +218,6 @@ "version": "1.0.0", "depth": 0, "source": "builtin", - "dependencies": { - "com.unity.modules.ui": "1.0.0", - "com.unity.modules.imgui": "1.0.0", - "com.unity.modules.jsonserialize": "1.0.0", - "com.unity.modules.uielementsnative": "1.0.0" - } - }, - "com.unity.modules.uielementsnative": { - "version": "1.0.0", - "depth": 1, - "source": "builtin", "dependencies": { "com.unity.modules.ui": "1.0.0", "com.unity.modules.imgui": "1.0.0", diff --git a/TestProjects/Empty/ProjectSettings/ProjectVersion.txt b/TestProjects/Empty/ProjectSettings/ProjectVersion.txt index 8ea1b855a..3643b0227 100644 --- a/TestProjects/Empty/ProjectSettings/ProjectVersion.txt +++ b/TestProjects/Empty/ProjectSettings/ProjectVersion.txt @@ -1,2 +1,2 @@ -m_EditorVersion: 2021.3.11f1 -m_EditorVersionWithRevision: 2021.3.11f1 (0a5ca18544bf) +m_EditorVersion: 2021.3.16f1 +m_EditorVersionWithRevision: 2021.3.16f1 (4016570cf34f) diff --git a/TestProjects/Empty/ProjectSettings/boot.config b/TestProjects/Empty/ProjectSettings/boot.config deleted file mode 100644 index e69de29bb..000000000 diff --git a/WebApp/client/package-lock.json b/WebApp/client/package-lock.json index 686fdc073..d9d94444e 100644 --- a/WebApp/client/package-lock.json +++ b/WebApp/client/package-lock.json @@ -30,17 +30,89 @@ } }, "node_modules/@babel/code-frame": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.18.6.tgz", - "integrity": "sha512-TDCmlK5eOvH+eH7cdAFlNXeVJqWIQ7gW9tY1GJIpUtFb6CmjVyq2VM3u71bOyR8CRihcCgMUYoDNyLXao3+70Q==", + "version": "7.22.13", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.22.13.tgz", + "integrity": "sha512-XktuhWlJ5g+3TJXc5upd9Ks1HutSArik6jf2eAjYFyIOf4ej3RN+184cZbzDvbPnuTJIUhPKKJE3cIsYTiAT3w==", "dev": true, "dependencies": { - "@babel/highlight": "^7.18.6" + "@babel/highlight": "^7.22.13", + "chalk": "^2.4.2" }, "engines": { "node": ">=6.9.0" } }, + "node_modules/@babel/code-frame/node_modules/ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "dev": true, + "dependencies": { + "color-convert": "^1.9.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/@babel/code-frame/node_modules/chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "dev": true, + "dependencies": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/@babel/code-frame/node_modules/color-convert": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "dev": true, + "dependencies": { + "color-name": "1.1.3" + } + }, + "node_modules/@babel/code-frame/node_modules/color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", + "dev": true + }, + "node_modules/@babel/code-frame/node_modules/escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", + "dev": true, + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/@babel/code-frame/node_modules/has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/@babel/code-frame/node_modules/supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dev": true, + "dependencies": { + "has-flag": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, "node_modules/@babel/compat-data": { "version": "7.19.0", "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.19.0.tgz", @@ -90,13 +162,14 @@ } }, "node_modules/@babel/generator": { - "version": "7.19.0", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.19.0.tgz", - "integrity": "sha512-S1ahxf1gZ2dpoiFgA+ohK9DIpz50bJ0CWs7Zlzb54Z4sG8qmdIrGrVqmy1sAtTVRb+9CU6U8VqT9L0Zj7hxHVg==", + "version": "7.23.0", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.23.0.tgz", + "integrity": "sha512-lN85QRR+5IbYrMWM6Y4pE/noaQtg4pNiqeNGX60eqOfo6gtEj6uw/JagelB8vVztSd7R6M5n1+PQkDbHbBRU4g==", "dev": true, "dependencies": { - "@babel/types": "^7.19.0", + "@babel/types": "^7.23.0", "@jridgewell/gen-mapping": "^0.3.2", + "@jridgewell/trace-mapping": "^0.3.17", "jsesc": "^2.5.1" }, "engines": { @@ -145,34 +218,34 @@ } }, "node_modules/@babel/helper-environment-visitor": { - "version": "7.18.9", - "resolved": "https://registry.npmjs.org/@babel/helper-environment-visitor/-/helper-environment-visitor-7.18.9.tgz", - "integrity": "sha512-3r/aACDJ3fhQ/EVgFy0hpj8oHyHpQc+LPtJoY9SzTThAsStm4Ptegq92vqKoE3vD706ZVFWITnMnxucw+S9Ipg==", + "version": "7.22.20", + "resolved": "https://registry.npmjs.org/@babel/helper-environment-visitor/-/helper-environment-visitor-7.22.20.tgz", + "integrity": "sha512-zfedSIzFhat/gFhWfHtgWvlec0nqB9YEIVrpuwjruLlXfUSnA8cJB0miHKwqDnQ7d32aKo2xt88/xZptwxbfhA==", "dev": true, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-function-name": { - "version": "7.19.0", - "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.19.0.tgz", - "integrity": "sha512-WAwHBINyrpqywkUH0nTnNgI5ina5TFn85HKS0pbPDfxFfhyR/aNQEn4hGi1P1JyT//I0t4OgXUlofzWILRvS5w==", + "version": "7.23.0", + "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.23.0.tgz", + "integrity": "sha512-OErEqsrxjZTJciZ4Oo+eoZqeW9UIiOcuYKRJA4ZAgV9myA+pOXhhmpfNCKjEH/auVfEYVFJ6y1Tc4r0eIApqiw==", "dev": true, "dependencies": { - "@babel/template": "^7.18.10", - "@babel/types": "^7.19.0" + "@babel/template": "^7.22.15", + "@babel/types": "^7.23.0" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-hoist-variables": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.18.6.tgz", - "integrity": "sha512-UlJQPkFqFULIcyW5sbzgbkxn2FKRgwWiRexcuaR8RNJRy8+LLveqPjwZV/bwrLZCN0eUHD/x8D0heK1ozuoo6Q==", + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.22.5.tgz", + "integrity": "sha512-wGjk9QZVzvknA6yKIUURb8zY3grXCcOZt+/7Wcy8O2uctxhplmUPkOdlgoNhmdVee2c92JXbf1xpMtVNbfoxRw==", "dev": true, "dependencies": { - "@babel/types": "^7.18.6" + "@babel/types": "^7.22.5" }, "engines": { "node": ">=6.9.0" @@ -231,30 +304,30 @@ } }, "node_modules/@babel/helper-split-export-declaration": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.18.6.tgz", - "integrity": "sha512-bde1etTx6ZyTmobl9LLMMQsaizFVZrquTEHOqKeQESMKo4PlObf+8+JA25ZsIpZhT/WEd39+vOdLXAFG/nELpA==", + "version": "7.22.6", + "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.22.6.tgz", + "integrity": "sha512-AsUnxuLhRYsisFiaJwvp1QF+I3KjD5FOxut14q/GzovUe6orHLesW2C7d754kRm53h5gqrz6sFl6sxc4BVtE/g==", "dev": true, "dependencies": { - "@babel/types": "^7.18.6" + "@babel/types": "^7.22.5" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-string-parser": { - "version": "7.18.10", - "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.18.10.tgz", - "integrity": "sha512-XtIfWmeNY3i4t7t4D2t02q50HvqHybPqW2ki1kosnvWCwuCMeo81Jf0gwr85jy/neUdg5XDdeFE/80DXiO+njw==", + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.22.5.tgz", + "integrity": "sha512-mM4COjgZox8U+JcXQwPijIZLElkgEpO5rsERVDJTc2qfCDfERyob6k5WegS14SX18IIjv+XD+GrqNumY5JRCDw==", "dev": true, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-validator-identifier": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.18.6.tgz", - "integrity": "sha512-MmetCkz9ej86nJQV+sFCxoGGrUbU3q02kgLciwkrt9QqEB7cP39oKEY0PakknEO0Gu20SskMRi+AYZ3b1TpN9g==", + "version": "7.22.20", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.22.20.tgz", + "integrity": "sha512-Y4OZ+ytlatR8AI+8KZfKuL5urKp7qey08ha31L8b3BwewJAoJamTzyvxPR/5D+KkdJCGPq/+8TukHBlY10FX9A==", "dev": true, "engines": { "node": ">=6.9.0" @@ -284,13 +357,13 @@ } }, "node_modules/@babel/highlight": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.18.6.tgz", - "integrity": "sha512-u7stbOuYjaPezCuLj29hNW1v64M2Md2qupEKP1fHc7WdOA3DgLh37suiSrZYY7haUB7iBeQZ9P1uiRF359do3g==", + "version": "7.22.20", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.22.20.tgz", + "integrity": "sha512-dkdMCN3py0+ksCgYmGG8jKeGA/8Tk+gJwSYYlFGxG5lmhfKNoAy004YpLxpS1W2J8m/EK2Ew+yOs9pVRwO89mg==", "dev": true, "dependencies": { - "@babel/helper-validator-identifier": "^7.18.6", - "chalk": "^2.0.0", + "@babel/helper-validator-identifier": "^7.22.20", + "chalk": "^2.4.2", "js-tokens": "^4.0.0" }, "engines": { @@ -369,9 +442,9 @@ } }, "node_modules/@babel/parser": { - "version": "7.19.0", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.19.0.tgz", - "integrity": "sha512-74bEXKX2h+8rrfQUfsBfuZZHzsEs6Eql4pqy/T4Nn6Y9wNPggQOqD6z6pn5Bl8ZfysKouFZT/UXEH94ummEeQw==", + "version": "7.23.0", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.23.0.tgz", + "integrity": "sha512-vvPKKdMemU85V9WE/l5wZEmImpCtLqbnTvqDS2U1fJ96KrxoW7KrXhNsNCblQlg8Ck4b85yxdTyelsMUgFUXiw==", "dev": true, "bin": { "parser": "bin/babel-parser.js" @@ -558,33 +631,33 @@ } }, "node_modules/@babel/template": { - "version": "7.18.10", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.18.10.tgz", - "integrity": "sha512-TI+rCtooWHr3QJ27kJxfjutghu44DLnasDMwpDqCXVTal9RLp3RSYNh4NdBrRP2cQAoG9A8juOQl6P6oZG4JxA==", + "version": "7.22.15", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.22.15.tgz", + "integrity": "sha512-QPErUVm4uyJa60rkI73qneDacvdvzxshT3kksGqlGWYdOTIUOwJ7RDUL8sGqslY1uXWSL6xMFKEXDS3ox2uF0w==", "dev": true, "dependencies": { - "@babel/code-frame": "^7.18.6", - "@babel/parser": "^7.18.10", - "@babel/types": "^7.18.10" + "@babel/code-frame": "^7.22.13", + "@babel/parser": "^7.22.15", + "@babel/types": "^7.22.15" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/traverse": { - "version": "7.19.0", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.19.0.tgz", - "integrity": "sha512-4pKpFRDh+utd2mbRC8JLnlsMUii3PMHjpL6a0SZ4NMZy7YFP9aXORxEhdMVOc9CpWtDF09IkciQLEhK7Ml7gRA==", - "dev": true, - "dependencies": { - "@babel/code-frame": "^7.18.6", - "@babel/generator": "^7.19.0", - "@babel/helper-environment-visitor": "^7.18.9", - "@babel/helper-function-name": "^7.19.0", - "@babel/helper-hoist-variables": "^7.18.6", - "@babel/helper-split-export-declaration": "^7.18.6", - "@babel/parser": "^7.19.0", - "@babel/types": "^7.19.0", + "version": "7.23.2", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.23.2.tgz", + "integrity": "sha512-azpe59SQ48qG6nu2CzcMLbxUudtN+dOM9kDbUqGq3HXUJRlo7i8fvPoxQUzYgLZ4cMVmuZgm8vvBpNeRhd6XSw==", + "dev": true, + "dependencies": { + "@babel/code-frame": "^7.22.13", + "@babel/generator": "^7.23.0", + "@babel/helper-environment-visitor": "^7.22.20", + "@babel/helper-function-name": "^7.23.0", + "@babel/helper-hoist-variables": "^7.22.5", + "@babel/helper-split-export-declaration": "^7.22.6", + "@babel/parser": "^7.23.0", + "@babel/types": "^7.23.0", "debug": "^4.1.0", "globals": "^11.1.0" }, @@ -602,13 +675,13 @@ } }, "node_modules/@babel/types": { - "version": "7.19.0", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.19.0.tgz", - "integrity": "sha512-YuGopBq3ke25BVSiS6fgF49Ul9gH1x70Bcr6bqRLjWCkcX8Hre1/5+z+IiWOIerRMSSEfGZVB9z9kyq7wVs9YA==", + "version": "7.23.0", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.23.0.tgz", + "integrity": "sha512-0oIyUfKoI3mSqMvsxBdclDwxXKXAUA8v/apZbc+iSyARYou1o8ZGDxbUYyLFoW2arqS2jDGqJuZvv1d/io1axg==", "dev": true, "dependencies": { - "@babel/helper-string-parser": "^7.18.10", - "@babel/helper-validator-identifier": "^7.18.6", + "@babel/helper-string-parser": "^7.22.5", + "@babel/helper-validator-identifier": "^7.22.20", "to-fast-properties": "^2.0.0" }, "engines": { @@ -1127,13 +1200,13 @@ "dev": true }, "node_modules/@jridgewell/trace-mapping": { - "version": "0.3.15", - "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.15.tgz", - "integrity": "sha512-oWZNOULl+UbhsgB51uuZzglikfIKSUBO/M9W2OfEjn7cmqoAiCgmv9lyACTUacZwBz0ITnJ2NqjU8Tx0DHL88g==", + "version": "0.3.20", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.20.tgz", + "integrity": "sha512-R8LcPeWZol2zR8mmH3JeKQ6QRCFb7XgUhV9ZlGhHLGyg4wpPiPZNQOOWhFZhxKw8u//yTbNGI42Bx/3paXEQ+Q==", "dev": true, "dependencies": { - "@jridgewell/resolve-uri": "^3.0.3", - "@jridgewell/sourcemap-codec": "^1.4.10" + "@jridgewell/resolve-uri": "^3.1.0", + "@jridgewell/sourcemap-codec": "^1.4.14" } }, "node_modules/@nodelib/fs.scandir": { @@ -1181,9 +1254,9 @@ } }, "node_modules/@sideway/formula": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/@sideway/formula/-/formula-3.0.0.tgz", - "integrity": "sha512-vHe7wZ4NOXVfkoRb8T5otiENVlT7a3IAiw7H5M2+GO+9CDgcVUUsX1zalAztCmwyOr2RUTGJdgB+ZvSVqmdHmg==", + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/@sideway/formula/-/formula-3.0.1.tgz", + "integrity": "sha512-/poHZJJVjx3L+zVD6g9KgHfYnb443oi7wLu/XKojDviHy6HOEOA6z1Trk5aR1dGcmPenJEgb2sK2I80LeS3MIg==", "dev": true }, "node_modules/@sideway/pinpoint": { @@ -4032,9 +4105,9 @@ "dev": true }, "node_modules/json5": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.1.tgz", - "integrity": "sha512-1hqLFMSrGHRHxav9q9gNjJ5EXznIxGVO09xQRrwplcS8qs28pZ8s8hupZAmqDwZUmVZ2Qb2jnyPOWcDH8m8dlA==", + "version": "2.2.3", + "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz", + "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==", "dev": true, "bin": { "json5": "lib/cli.js" @@ -5157,9 +5230,9 @@ } }, "node_modules/tough-cookie": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-4.1.2.tgz", - "integrity": "sha512-G9fqXWoYFZgTc2z8Q5zaHy/vJMjm+WV0AkAeHxVCQiEB1b+dGvWzFW6QV07cY5jQ5gRkeid2qIkzkxUnmoQZUQ==", + "version": "4.1.3", + "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-4.1.3.tgz", + "integrity": "sha512-aX/y5pVRkfRnfmuX+OdbSdXvPe6ieKX/G2s7e98f4poJHnqH3281gDPm/metm6E/WRamfx7WC4HUqkWHfQHprw==", "dev": true, "dependencies": { "psl": "^1.1.33", @@ -5445,9 +5518,9 @@ } }, "node_modules/word-wrap": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.3.tgz", - "integrity": "sha512-Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ==", + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.4.tgz", + "integrity": "sha512-2V81OA4ugVo5pRo46hAoD2ivUJx8jXmWXfUkY4KFNw0hEptvN0QfH3K4nHiwzGeKl5rFKedV48QVoqYavy4YpA==", "dev": true, "engines": { "node": ">=0.10.0" @@ -5592,12 +5665,71 @@ } }, "@babel/code-frame": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.18.6.tgz", - "integrity": "sha512-TDCmlK5eOvH+eH7cdAFlNXeVJqWIQ7gW9tY1GJIpUtFb6CmjVyq2VM3u71bOyR8CRihcCgMUYoDNyLXao3+70Q==", + "version": "7.22.13", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.22.13.tgz", + "integrity": "sha512-XktuhWlJ5g+3TJXc5upd9Ks1HutSArik6jf2eAjYFyIOf4ej3RN+184cZbzDvbPnuTJIUhPKKJE3cIsYTiAT3w==", "dev": true, "requires": { - "@babel/highlight": "^7.18.6" + "@babel/highlight": "^7.22.13", + "chalk": "^2.4.2" + }, + "dependencies": { + "ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "dev": true, + "requires": { + "color-convert": "^1.9.0" + } + }, + "chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "dev": true, + "requires": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + } + }, + "color-convert": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "dev": true, + "requires": { + "color-name": "1.1.3" + } + }, + "color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", + "dev": true + }, + "escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", + "dev": true + }, + "has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", + "dev": true + }, + "supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dev": true, + "requires": { + "has-flag": "^3.0.0" + } + } } }, "@babel/compat-data": { @@ -5638,13 +5770,14 @@ } }, "@babel/generator": { - "version": "7.19.0", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.19.0.tgz", - "integrity": "sha512-S1ahxf1gZ2dpoiFgA+ohK9DIpz50bJ0CWs7Zlzb54Z4sG8qmdIrGrVqmy1sAtTVRb+9CU6U8VqT9L0Zj7hxHVg==", + "version": "7.23.0", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.23.0.tgz", + "integrity": "sha512-lN85QRR+5IbYrMWM6Y4pE/noaQtg4pNiqeNGX60eqOfo6gtEj6uw/JagelB8vVztSd7R6M5n1+PQkDbHbBRU4g==", "dev": true, "requires": { - "@babel/types": "^7.19.0", + "@babel/types": "^7.23.0", "@jridgewell/gen-mapping": "^0.3.2", + "@jridgewell/trace-mapping": "^0.3.17", "jsesc": "^2.5.1" }, "dependencies": { @@ -5682,28 +5815,28 @@ } }, "@babel/helper-environment-visitor": { - "version": "7.18.9", - "resolved": "https://registry.npmjs.org/@babel/helper-environment-visitor/-/helper-environment-visitor-7.18.9.tgz", - "integrity": "sha512-3r/aACDJ3fhQ/EVgFy0hpj8oHyHpQc+LPtJoY9SzTThAsStm4Ptegq92vqKoE3vD706ZVFWITnMnxucw+S9Ipg==", + "version": "7.22.20", + "resolved": "https://registry.npmjs.org/@babel/helper-environment-visitor/-/helper-environment-visitor-7.22.20.tgz", + "integrity": "sha512-zfedSIzFhat/gFhWfHtgWvlec0nqB9YEIVrpuwjruLlXfUSnA8cJB0miHKwqDnQ7d32aKo2xt88/xZptwxbfhA==", "dev": true }, "@babel/helper-function-name": { - "version": "7.19.0", - "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.19.0.tgz", - "integrity": "sha512-WAwHBINyrpqywkUH0nTnNgI5ina5TFn85HKS0pbPDfxFfhyR/aNQEn4hGi1P1JyT//I0t4OgXUlofzWILRvS5w==", + "version": "7.23.0", + "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.23.0.tgz", + "integrity": "sha512-OErEqsrxjZTJciZ4Oo+eoZqeW9UIiOcuYKRJA4ZAgV9myA+pOXhhmpfNCKjEH/auVfEYVFJ6y1Tc4r0eIApqiw==", "dev": true, "requires": { - "@babel/template": "^7.18.10", - "@babel/types": "^7.19.0" + "@babel/template": "^7.22.15", + "@babel/types": "^7.23.0" } }, "@babel/helper-hoist-variables": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.18.6.tgz", - "integrity": "sha512-UlJQPkFqFULIcyW5sbzgbkxn2FKRgwWiRexcuaR8RNJRy8+LLveqPjwZV/bwrLZCN0eUHD/x8D0heK1ozuoo6Q==", + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.22.5.tgz", + "integrity": "sha512-wGjk9QZVzvknA6yKIUURb8zY3grXCcOZt+/7Wcy8O2uctxhplmUPkOdlgoNhmdVee2c92JXbf1xpMtVNbfoxRw==", "dev": true, "requires": { - "@babel/types": "^7.18.6" + "@babel/types": "^7.22.5" } }, "@babel/helper-module-imports": { @@ -5747,24 +5880,24 @@ } }, "@babel/helper-split-export-declaration": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.18.6.tgz", - "integrity": "sha512-bde1etTx6ZyTmobl9LLMMQsaizFVZrquTEHOqKeQESMKo4PlObf+8+JA25ZsIpZhT/WEd39+vOdLXAFG/nELpA==", + "version": "7.22.6", + "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.22.6.tgz", + "integrity": "sha512-AsUnxuLhRYsisFiaJwvp1QF+I3KjD5FOxut14q/GzovUe6orHLesW2C7d754kRm53h5gqrz6sFl6sxc4BVtE/g==", "dev": true, "requires": { - "@babel/types": "^7.18.6" + "@babel/types": "^7.22.5" } }, "@babel/helper-string-parser": { - "version": "7.18.10", - "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.18.10.tgz", - "integrity": "sha512-XtIfWmeNY3i4t7t4D2t02q50HvqHybPqW2ki1kosnvWCwuCMeo81Jf0gwr85jy/neUdg5XDdeFE/80DXiO+njw==", + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.22.5.tgz", + "integrity": "sha512-mM4COjgZox8U+JcXQwPijIZLElkgEpO5rsERVDJTc2qfCDfERyob6k5WegS14SX18IIjv+XD+GrqNumY5JRCDw==", "dev": true }, "@babel/helper-validator-identifier": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.18.6.tgz", - "integrity": "sha512-MmetCkz9ej86nJQV+sFCxoGGrUbU3q02kgLciwkrt9QqEB7cP39oKEY0PakknEO0Gu20SskMRi+AYZ3b1TpN9g==", + "version": "7.22.20", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.22.20.tgz", + "integrity": "sha512-Y4OZ+ytlatR8AI+8KZfKuL5urKp7qey08ha31L8b3BwewJAoJamTzyvxPR/5D+KkdJCGPq/+8TukHBlY10FX9A==", "dev": true }, "@babel/helper-validator-option": { @@ -5785,13 +5918,13 @@ } }, "@babel/highlight": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.18.6.tgz", - "integrity": "sha512-u7stbOuYjaPezCuLj29hNW1v64M2Md2qupEKP1fHc7WdOA3DgLh37suiSrZYY7haUB7iBeQZ9P1uiRF359do3g==", + "version": "7.22.20", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.22.20.tgz", + "integrity": "sha512-dkdMCN3py0+ksCgYmGG8jKeGA/8Tk+gJwSYYlFGxG5lmhfKNoAy004YpLxpS1W2J8m/EK2Ew+yOs9pVRwO89mg==", "dev": true, "requires": { - "@babel/helper-validator-identifier": "^7.18.6", - "chalk": "^2.0.0", + "@babel/helper-validator-identifier": "^7.22.20", + "chalk": "^2.4.2", "js-tokens": "^4.0.0" }, "dependencies": { @@ -5854,9 +5987,9 @@ } }, "@babel/parser": { - "version": "7.19.0", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.19.0.tgz", - "integrity": "sha512-74bEXKX2h+8rrfQUfsBfuZZHzsEs6Eql4pqy/T4Nn6Y9wNPggQOqD6z6pn5Bl8ZfysKouFZT/UXEH94ummEeQw==", + "version": "7.23.0", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.23.0.tgz", + "integrity": "sha512-vvPKKdMemU85V9WE/l5wZEmImpCtLqbnTvqDS2U1fJ96KrxoW7KrXhNsNCblQlg8Ck4b85yxdTyelsMUgFUXiw==", "dev": true }, "@babel/plugin-syntax-async-generators": { @@ -5986,30 +6119,30 @@ } }, "@babel/template": { - "version": "7.18.10", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.18.10.tgz", - "integrity": "sha512-TI+rCtooWHr3QJ27kJxfjutghu44DLnasDMwpDqCXVTal9RLp3RSYNh4NdBrRP2cQAoG9A8juOQl6P6oZG4JxA==", + "version": "7.22.15", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.22.15.tgz", + "integrity": "sha512-QPErUVm4uyJa60rkI73qneDacvdvzxshT3kksGqlGWYdOTIUOwJ7RDUL8sGqslY1uXWSL6xMFKEXDS3ox2uF0w==", "dev": true, "requires": { - "@babel/code-frame": "^7.18.6", - "@babel/parser": "^7.18.10", - "@babel/types": "^7.18.10" + "@babel/code-frame": "^7.22.13", + "@babel/parser": "^7.22.15", + "@babel/types": "^7.22.15" } }, "@babel/traverse": { - "version": "7.19.0", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.19.0.tgz", - "integrity": "sha512-4pKpFRDh+utd2mbRC8JLnlsMUii3PMHjpL6a0SZ4NMZy7YFP9aXORxEhdMVOc9CpWtDF09IkciQLEhK7Ml7gRA==", - "dev": true, - "requires": { - "@babel/code-frame": "^7.18.6", - "@babel/generator": "^7.19.0", - "@babel/helper-environment-visitor": "^7.18.9", - "@babel/helper-function-name": "^7.19.0", - "@babel/helper-hoist-variables": "^7.18.6", - "@babel/helper-split-export-declaration": "^7.18.6", - "@babel/parser": "^7.19.0", - "@babel/types": "^7.19.0", + "version": "7.23.2", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.23.2.tgz", + "integrity": "sha512-azpe59SQ48qG6nu2CzcMLbxUudtN+dOM9kDbUqGq3HXUJRlo7i8fvPoxQUzYgLZ4cMVmuZgm8vvBpNeRhd6XSw==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.22.13", + "@babel/generator": "^7.23.0", + "@babel/helper-environment-visitor": "^7.22.20", + "@babel/helper-function-name": "^7.23.0", + "@babel/helper-hoist-variables": "^7.22.5", + "@babel/helper-split-export-declaration": "^7.22.6", + "@babel/parser": "^7.23.0", + "@babel/types": "^7.23.0", "debug": "^4.1.0", "globals": "^11.1.0" }, @@ -6023,13 +6156,13 @@ } }, "@babel/types": { - "version": "7.19.0", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.19.0.tgz", - "integrity": "sha512-YuGopBq3ke25BVSiS6fgF49Ul9gH1x70Bcr6bqRLjWCkcX8Hre1/5+z+IiWOIerRMSSEfGZVB9z9kyq7wVs9YA==", + "version": "7.23.0", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.23.0.tgz", + "integrity": "sha512-0oIyUfKoI3mSqMvsxBdclDwxXKXAUA8v/apZbc+iSyARYou1o8ZGDxbUYyLFoW2arqS2jDGqJuZvv1d/io1axg==", "dev": true, "requires": { - "@babel/helper-string-parser": "^7.18.10", - "@babel/helper-validator-identifier": "^7.18.6", + "@babel/helper-string-parser": "^7.22.5", + "@babel/helper-validator-identifier": "^7.22.20", "to-fast-properties": "^2.0.0" } }, @@ -6433,13 +6566,13 @@ "dev": true }, "@jridgewell/trace-mapping": { - "version": "0.3.15", - "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.15.tgz", - "integrity": "sha512-oWZNOULl+UbhsgB51uuZzglikfIKSUBO/M9W2OfEjn7cmqoAiCgmv9lyACTUacZwBz0ITnJ2NqjU8Tx0DHL88g==", + "version": "0.3.20", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.20.tgz", + "integrity": "sha512-R8LcPeWZol2zR8mmH3JeKQ6QRCFb7XgUhV9ZlGhHLGyg4wpPiPZNQOOWhFZhxKw8u//yTbNGI42Bx/3paXEQ+Q==", "dev": true, "requires": { - "@jridgewell/resolve-uri": "^3.0.3", - "@jridgewell/sourcemap-codec": "^1.4.10" + "@jridgewell/resolve-uri": "^3.1.0", + "@jridgewell/sourcemap-codec": "^1.4.14" } }, "@nodelib/fs.scandir": { @@ -6478,9 +6611,9 @@ } }, "@sideway/formula": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/@sideway/formula/-/formula-3.0.0.tgz", - "integrity": "sha512-vHe7wZ4NOXVfkoRb8T5otiENVlT7a3IAiw7H5M2+GO+9CDgcVUUsX1zalAztCmwyOr2RUTGJdgB+ZvSVqmdHmg==", + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/@sideway/formula/-/formula-3.0.1.tgz", + "integrity": "sha512-/poHZJJVjx3L+zVD6g9KgHfYnb443oi7wLu/XKojDviHy6HOEOA6z1Trk5aR1dGcmPenJEgb2sK2I80LeS3MIg==", "dev": true }, "@sideway/pinpoint": { @@ -8638,9 +8771,9 @@ "dev": true }, "json5": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.1.tgz", - "integrity": "sha512-1hqLFMSrGHRHxav9q9gNjJ5EXznIxGVO09xQRrwplcS8qs28pZ8s8hupZAmqDwZUmVZ2Qb2jnyPOWcDH8m8dlA==", + "version": "2.2.3", + "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz", + "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==", "dev": true }, "kleur": { @@ -9456,9 +9589,9 @@ } }, "tough-cookie": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-4.1.2.tgz", - "integrity": "sha512-G9fqXWoYFZgTc2z8Q5zaHy/vJMjm+WV0AkAeHxVCQiEB1b+dGvWzFW6QV07cY5jQ5gRkeid2qIkzkxUnmoQZUQ==", + "version": "4.1.3", + "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-4.1.3.tgz", + "integrity": "sha512-aX/y5pVRkfRnfmuX+OdbSdXvPe6ieKX/G2s7e98f4poJHnqH3281gDPm/metm6E/WRamfx7WC4HUqkWHfQHprw==", "dev": true, "requires": { "psl": "^1.1.33", @@ -9658,9 +9791,9 @@ } }, "word-wrap": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.3.tgz", - "integrity": "sha512-Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ==", + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.4.tgz", + "integrity": "sha512-2V81OA4ugVo5pRo46hAoD2ivUJx8jXmWXfUkY4KFNw0hEptvN0QfH3K4nHiwzGeKl5rFKedV48QVoqYavy4YpA==", "dev": true }, "wrap-ansi": { diff --git a/WebApp/client/public/bidirectional/index.html b/WebApp/client/public/bidirectional/index.html index e275d5b06..84dad5e82 100644 --- a/WebApp/client/public/bidirectional/index.html +++ b/WebApp/client/public/bidirectional/index.html @@ -16,23 +16,24 @@

Bidirectional Sample

- - + + + +
- +
- - + +
- - - + + +
@@ -54,7 +55,7 @@

Remote

Codec preferences: -
@@ -75,9 +76,8 @@

Remote

- - \ No newline at end of file + diff --git a/WebApp/client/public/bidirectional/js/main.js b/WebApp/client/public/bidirectional/js/main.js index 15f01785d..b6805ba0b 100644 --- a/WebApp/client/public/bidirectional/js/main.js +++ b/WebApp/client/public/bidirectional/js/main.js @@ -58,7 +58,9 @@ const hangUpButton = document.getElementById('hangUpButton'); hangUpButton.addEventListener('click', hangUp); window.addEventListener('beforeunload', async () => { - await sendVideo.stop(); + if(!renderstreaming) + return; + await renderstreaming.stop(); }, true); setupConfig(); @@ -84,7 +86,6 @@ async function startVideo() { cameraWidthInput.disabled = true; cameraHeightInput.disabled = true; startButton.disabled = true; - setupButton.disabled = false; let width = 0; let height = 0; @@ -98,6 +99,9 @@ async function startVideo() { } await sendVideo.startLocalVideo(videoSelect.value, audioSelect.value, width, height); + + // enable setup button after initializing local video. + setupButton.disabled = false; } async function setUp() { @@ -112,7 +116,7 @@ async function setUp() { renderstreaming.onConnect = () => { const tracks = sendVideo.getLocalTracks(); for (const track of tracks) { - renderstreaming.addTrack(track); + renderstreaming.addTransceiver(track, { direction: 'sendonly' }); } setCodecPreferences(); showStatsMessage(); @@ -280,4 +284,4 @@ function clearStatsMessage() { remoteVideoStatsDiv.innerHTML = ''; messageDiv.style.display = 'none'; messageDiv.innerHTML = ''; -} \ No newline at end of file +} diff --git a/WebApp/client/public/bidirectional/js/sendvideo.js b/WebApp/client/public/bidirectional/js/sendvideo.js index b6cd6c285..8cea080b3 100644 --- a/WebApp/client/public/bidirectional/js/sendvideo.js +++ b/WebApp/client/public/bidirectional/js/sendvideo.js @@ -7,10 +7,10 @@ export class SendVideo { } /** - * @param {MediaTrackConstraints} videoSource - * @param {MediaTrackConstraints} audioSource - * @param {number} videoWidth - * @param {number} videoHeight + * @param {MediaTrackConstraints} videoSource + * @param {MediaTrackConstraints} audioSource + * @param {number} videoWidth + * @param {number} videoHeight */ async startLocalVideo(videoSource, audioSource, videoWidth, videoHeight) { try { @@ -42,7 +42,7 @@ export class SendVideo { } /** - * @param {MediaStreamTrack} track + * @param {MediaStreamTrack} track */ addRemoteTrack(track) { if (this.remoteVideo.srcObject == null) { diff --git a/WebApp/client/public/css/main.css b/WebApp/client/public/css/main.css index 9aa2078df..28f66a2ed 100644 --- a/WebApp/client/public/css/main.css +++ b/WebApp/client/public/css/main.css @@ -18,12 +18,43 @@ body { word-break: break-word; } +button { + margin: 20px 10px 0 0; + width: 130px; +} + +button#gather { + display: block; +} + section { border-bottom: 1px solid #eee; margin: 0 0 1.5em 0; padding: 0 0 1.5em 0; } +section#iceServers label { + display: inline-block; + width: 150px; +} + +section#iceServers input { + margin: 0 0 10px; + width: 260px; +} + +select { + margin: 0 1em 1em 0; + position: relative; + top: -1px; +} + +select#servers { + font-size: 1em; + padding: 5px; + width: 420px; +} + section:last-child { border-bottom: none; margin: 0; diff --git a/WebApp/client/public/index.html b/WebApp/client/public/index.html index 9c53fa29a..b71b437b6 100644 --- a/WebApp/client/public/index.html +++ b/WebApp/client/public/index.html @@ -15,9 +15,33 @@

Unity Render Streaming Samples

+

Server Configuration

+
+

ICE servers

+ +
+ + +
+
+ + +
+
+ + +
+
+ + + +
+
+

Receiver Sample

This is a sample for receiving video / audio from Unity.

@@ -50,4 +74,4 @@

VideoPlayer Sample

- \ No newline at end of file + diff --git a/WebApp/client/public/js/config.js b/WebApp/client/public/js/config.js index d532bdc2f..6336048dc 100644 --- a/WebApp/client/public/js/config.js +++ b/WebApp/client/public/js/config.js @@ -1,3 +1,5 @@ +import {getServers} from "./icesettings.js"; + export async function getServerConfig() { const protocolEndPoint = location.origin + '/config'; const createResponse = await fetch(protocolEndPoint); @@ -7,6 +9,6 @@ export async function getServerConfig() { export function getRTCConfiguration() { let config = {}; config.sdpSemantics = 'unified-plan'; - config.iceServers = [{ urls: ['stun:stun.l.google.com:19302'] }]; + config.iceServers = getServers(); return config; -} \ No newline at end of file +} diff --git a/WebApp/client/public/js/icesettings.js b/WebApp/client/public/js/icesettings.js new file mode 100644 index 000000000..22b986f78 --- /dev/null +++ b/WebApp/client/public/js/icesettings.js @@ -0,0 +1,103 @@ +// This code is referenced from webrtc sample. +// https://github.com/webrtc/samples/blob/gh-pages/src/content/peerconnection/trickle-ice/js/main.js + +const servers = document.querySelector('select#servers'); +const urlInput = document.querySelector('input#url'); +const usernameInput = document.querySelector('input#username'); +const passwordInput = document.querySelector('input#password'); + +const allServersKey = 'servers'; + +export function addServer() { + const scheme = urlInput.value.split(':')[0]; + if (!['stun', 'stuns', 'turn', 'turns'].includes(scheme)) { + alert(`URI scheme ${scheme} is not valid`); + return; + } + + // Store the ICE server as a stringified JSON object in option.value. + const option = document.createElement('option'); + const iceServer = { + urls: [urlInput.value], + username: usernameInput.value, + credential: passwordInput.value + }; + option.value = JSON.stringify(iceServer); + option.text = `${urlInput.value} `; + const username = usernameInput.value; + const password = passwordInput.value; + if (username || password) { + option.text += (` [${username}:${password}]`); + } + option.ondblclick = selectServer; + servers.add(option); + urlInput.value = usernameInput.value = passwordInput.value = ''; + writeServersToLocalStorage(); +} + +export function removeServer() { + for (let i = servers.options.length - 1; i >= 0; --i) { + if (servers.options[i].selected) { + servers.remove(i); + } + } + writeServersToLocalStorage(); +} + +export function reset() { + window.localStorage.clear(); + document.querySelectorAll('select#servers option').forEach(option => option.remove()); + const serversSelect = document.querySelector('select#servers'); + setDefaultServer(serversSelect); +} + +function selectServer(event) { + const option = event.target; + const value = JSON.parse(option.value); + urlInput.value = value.urls[0]; + usernameInput.value = value.username || ''; + passwordInput.value = value.credential || ''; +} + +function setDefaultServer(serversSelect) { + const option = document.createElement('option'); + option.value = '{"urls":["stun:stun.l.google.com:19302"]}'; + option.text = 'stun:stun.l.google.com:19302'; + option.ondblclick = selectServer; + serversSelect.add(option); +} + +function writeServersToLocalStorage() { + const serversSelect = document.querySelector('select#servers'); + const allServers = JSON.stringify(Object.values(serversSelect.options).map(o => JSON.parse(o.value))); + window.localStorage.setItem(allServersKey, allServers); +} + +export function readServersFromLocalStorage() { + document.querySelectorAll('select#servers option').forEach(option => option.remove()); + const serversSelect = document.querySelector('select#servers'); + const storedServers = window.localStorage.getItem(allServersKey); + + if (storedServers === null || storedServers === '') { + setDefaultServer(serversSelect); + } else { + JSON.parse(storedServers).forEach((server) => { + const o = document.createElement('option'); + o.value = JSON.stringify(server); + o.text = server.urls[0]; + o.ondblclick = selectServer; + serversSelect.add(o); + }); + } +} + +export function getServers() { + const storedServers = window.localStorage.getItem(allServersKey); + + if (storedServers === null || storedServers === '') { + return [{ urls: ['stun:stun.l.google.com:19302'] }]; + } + else { + return JSON.parse(storedServers); + } +} diff --git a/WebApp/client/public/js/main.js b/WebApp/client/public/js/main.js index 813b8a734..cdf5825b8 100644 --- a/WebApp/client/public/js/main.js +++ b/WebApp/client/public/js/main.js @@ -1,7 +1,15 @@ import * as Config from "./config.js"; +import {addServer, removeServer, reset, readServersFromLocalStorage} from "./icesettings.js"; +const addButton = document.querySelector('button#add'); +const removeButton = document.querySelector('button#remove'); +const resetButton = document.querySelector('button#reset'); const startupDiv = document.getElementById("startup"); -startupDiv.innerHTML = "

Server Configuration

"; + +addButton.onclick = addServer; +removeButton.onclick = removeServer; +resetButton.onclick = reset; +startupDiv.innerHTML = ""; const displayConfig = async () => { const res = await Config.getServerConfig(); @@ -16,3 +24,4 @@ const displayConfig = async () => { }; displayConfig(); +readServersFromLocalStorage(); diff --git a/WebApp/client/public/multiplay/index.html b/WebApp/client/public/multiplay/index.html index 01e7ad520..7cbf3d506 100644 --- a/WebApp/client/public/multiplay/index.html +++ b/WebApp/client/public/multiplay/index.html @@ -20,14 +20,14 @@

Multiplay Sample

Codec preferences: -
Lock Cursor to Player: - +

@@ -46,9 +46,8 @@

Multiplay Sample

- - \ No newline at end of file + diff --git a/WebApp/client/public/multiplay/js/main.js b/WebApp/client/public/multiplay/js/main.js index b75938d42..b9f147c07 100644 --- a/WebApp/client/public/multiplay/js/main.js +++ b/WebApp/client/public/multiplay/js/main.js @@ -39,6 +39,8 @@ window.addEventListener('resize', function () { }, true); window.addEventListener('beforeunload', async () => { + if(!renderstreaming) + return; await renderstreaming.stop(); }, true); @@ -198,4 +200,4 @@ function clearStatsMessage() { intervalId = null; messageDiv.style.display = 'none'; messageDiv.innerHTML = ''; -} \ No newline at end of file +} diff --git a/WebApp/client/public/receiver/index.html b/WebApp/client/public/receiver/index.html index e3dc616d1..56b281b56 100644 --- a/WebApp/client/public/receiver/index.html +++ b/WebApp/client/public/receiver/index.html @@ -20,18 +20,18 @@

Receiver Sample

Codec preferences: -
Lock Cursor to Player: - +

- For more information about sample, see + For more information about sample, see Broadcast sample document page.

@@ -46,9 +46,8 @@

Receiver Sample

- - \ No newline at end of file + diff --git a/WebApp/client/public/videoplayer/index.html b/WebApp/client/public/videoplayer/index.html index b602c4654..a1933cb68 100644 --- a/WebApp/client/public/videoplayer/index.html +++ b/WebApp/client/public/videoplayer/index.html @@ -30,7 +30,6 @@

VideoPlayer Sample

- diff --git a/WebApp/client/src/charnumber.js b/WebApp/client/src/charnumber.js new file mode 100644 index 000000000..2c792379d --- /dev/null +++ b/WebApp/client/src/charnumber.js @@ -0,0 +1,109 @@ +// KeyboardEvent.charcode is already deprecated. +// +export const CharNumber = { + "Backspace": 8, + "Tab": 9, + "Enter": 13, + "Shift": 16, + "Control": 17, + "Alt": 18, + "Pause": 19, + "CapsLock": 20, + "Escape": 27, + " ": 32, + "!": 33, + "\"": 34, + "#": 35, + "$": 36, + "%": 37, + "&": 38, + "'": 39, + "(": 40, + ")": 41, + "*": 42, + "+": 43, + ",": 44, + "-": 45, + ".": 46, + "/": 47, + "0": 48, + "1": 49, + "2": 50, + "3": 51, + "4": 52, + "5": 53, + "6": 54, + "7": 55, + "8": 56, + "9": 57, + ":": 58, + ";": 59, + "<": 60, + "=": 61, + ">": 62, + "?": 63, + "@": 64, + "A": 65, + "B": 66, + "C": 67, + "D": 68, + "E": 69, + "F": 70, + "G": 71, + "H": 72, + "I": 73, + "J": 74, + "K": 75, + "L": 76, + "M": 77, + "N": 78, + "O": 79, + "P": 80, + "Q": 81, + "R": 82, + "S": 83, + "T": 84, + "U": 85, + "V": 86, + "W": 87, + "X": 88, + "Y": 89, + "Z": 90, + "[": 91, + "\\": 92, + "]": 93, + "^": 94, + "_": 95, + "`": 96, + "a": 97, + "b": 98, + "c": 99, + "d": 100, + "e": 101, + "f": 102, + "g": 103, + "h": 104, + "i": 105, + "j": 106, + "k": 107, + "l": 108, + "m": 109, + "n": 110, + "o": 111, + "p": 112, + "q": 113, + "r": 114, + "s": 115, + "t": 116, + "u": 117, + "v": 118, + "w": 119, + "x": 120, + "y": 121, + "z": 122, + "{": 123, + "|": 124, + "}": 125, + "~": 126, + "Delete": 127 + }; diff --git a/WebApp/client/src/inputdevice.js b/WebApp/client/src/inputdevice.js index 3733d6cc5..50090f447 100644 --- a/WebApp/client/src/inputdevice.js +++ b/WebApp/client/src/inputdevice.js @@ -1,7 +1,8 @@ -import { +import { MemoryHelper, } from "./memoryhelper.js"; +import { CharNumber } from "./charnumber.js"; import { Keymap } from "./keymap.js"; import { MouseButton } from "./mousebutton.js"; import { GamepadButton } from "./gamepadbutton.js"; @@ -14,16 +15,16 @@ export class FourCC { */ /** - * - * @param {String} a - * @param {String} b - * @param {String} c - * @param {String} d + * + * @param {String} a + * @param {String} b + * @param {String} c + * @param {String} d */ constructor(a, b, c, d) { - this._code = (a.charCodeAt() << 24) - | (b.charCodeAt() << 16) - | (c.charCodeAt() << 8) + this._code = (a.charCodeAt() << 24) + | (b.charCodeAt() << 16) + | (c.charCodeAt() << 8) | d.charCodeAt(); } @@ -39,37 +40,37 @@ export class FourCC { export class InputDevice { /** - * + * * name; * layout; * deviceId; - * variants; + * usages; * description; - * + * * _inputState; */ - + /** - * - * @param {Number} name - * @param {String} layout - * @param {Number} deviceId - * @param {String} variants - * @param {Object} description + * + * @param {Number} name + * @param {String} layout + * @param {Number} deviceId + * @param {String[]} usages + * @param {Object} description */ - constructor(name, layout, deviceId, variants, description) { + constructor(name, layout, deviceId, usages, description) { this.name = name; this.layout = layout; this.deviceId = deviceId; - this.variants = variants; + this.usages = usages; this.description = description; this._inputState = null; } /** - * - * @param {IInputState} state + * + * @param {IInputState} state */ updateState(state) { this._inputState = state; @@ -78,7 +79,7 @@ export class InputDevice { queueEvent(event) { throw new Error(`Please implement this method. event:${event}`); } - + /** * @returns {IInputState} */ @@ -89,7 +90,7 @@ export class InputDevice { export class Mouse extends InputDevice { /** - * @param {(MouseEvent|WheelEvent)} event + * @param {(MouseEvent|WheelEvent)} event */ queueEvent(event) { this.updateState(new MouseState(event)); @@ -99,8 +100,8 @@ export class Mouse extends InputDevice { export class Keyboard extends InputDevice { static get keycount() { return 110; } /** - * - * @param {KeyboardEvent} event + * + * @param {KeyboardEvent} event */ queueEvent(event) { this.updateState(new KeyboardState(event, this.currentState)); @@ -109,7 +110,7 @@ export class Keyboard extends InputDevice { export class Touchscreen extends InputDevice { /** - * @param {TouchScreenEvent} event + * @param {TouchScreenEvent} event */ queueEvent(event, time) { this.updateState(new TouchscreenState(event, this.currentState, time)); @@ -118,7 +119,7 @@ export class Touchscreen extends InputDevice { export class Gamepad extends InputDevice { /** - * @param {GamepadButtonEvent | GamepadAxisEvent} event + * @param {GamepadButtonEvent | GamepadAxisEvent} event */ queueEvent(event) { this.updateState(new GamepadState(event)); @@ -129,29 +130,29 @@ export class InputEvent { static get invalidEventId() { return 0; } static get size() { return 20; } - /** + /** * field offset 0 * @member {Number} type; - * + * * field offset 4 * @member {Number} sizeInBytes; - * + * * field offset 6 * @member {Number} deviceId; - * + * * field offset 8 * @member {Number} time; - * + * * field offset 16 * @member {Number} eventId; */ /** - * - * @param {Number} type + * + * @param {Number} type * @param {Number} sizeInBytes - * @param {Number} deviceId - * @param {Number} time + * @param {Number} deviceId + * @param {Number} time */ constructor(type, sizeInBytes, deviceId, time) { this.type = type; @@ -187,7 +188,7 @@ export class IInputState { * @returns {Number} */ get format() { - throw new Error('Please implement this field'); + throw new Error('Please implement this field'); } } @@ -198,29 +199,29 @@ export class MouseState extends IInputState { /** * field offset 0 * @member {Array} position; - * + * * field offset 8 * @member {Array} delta; - * + * * field offset 16 * @member {Array} scroll; - * + * * field offset 24 * @member {ArrayBuffer} buttons; - * + * * field offset 26 * @member {Array} displayIndex; - * + * * field offset 28 * @member {Array} clickCount; */ /** - * @param {MouseEvent | WheelEvent} event + * @param {MouseEvent | WheelEvent} event */ constructor(event) { super(); - + this.position = [event.clientX, event.clientY]; this.delta = [event.movementX, -event.movementY]; this.scroll = [0, 0]; @@ -281,7 +282,7 @@ export class KeyboardState extends IInputState { */ /** - * @param {KeyboardEvent} event + * @param {KeyboardEvent} event */ constructor(event, state) { super(); @@ -323,7 +324,7 @@ export class KeyboardState extends IInputState { export class TouchState { static get format() { return new FourCC('T', 'O', 'U', 'C').toInt32(); } static get size() { return 56; } - static incrementTouchId() { + static incrementTouchId() { if(TouchState._currentTouchId === undefined) { TouchState._currentTouchId = 0; } @@ -332,7 +333,7 @@ export class TouchState { static prevTouches() { if(TouchState._prevTouches === undefined) { // max touch count is 10 - TouchState._prevTouches = new Array(10); + TouchState._prevTouches = new Array(10); } return TouchState._prevTouches; } @@ -366,42 +367,24 @@ export class TouchState { /** - * @param {Touch} touch - * @param {TouchState} state - * @param {String} type + * @param {Touch} touchId + * @param {TouchState} prevState + * @param {Number[]} position + * @param {Number} pressure + * @param {Number[]} radius + * @param {TouchPhase} phaseId + * @param {Number} time */ - constructor(touch, type, time) { - let phaseId = TouchPhase.Stationary; - switch(type) { - case 'touchstart': - phaseId = TouchPhase.Began; break; - case 'touchend': - phaseId = TouchPhase.Ended; break; - case 'touchmove': - phaseId = TouchPhase.Moved; break; - case 'touchcancel': - phaseId = TouchPhase.Canceled; break; - } - - let touchId = 0; - let state = null; - if(phaseId == TouchPhase.Began) { - touchId = TouchState.incrementTouchId(); - } - else { - state = TouchState.prevTouches[touch.identifier]; - touchId = state.touchId; - } - + constructor(touchId, prevState, position, pressure, radius, phaseId, time) { this.touchId = touchId; - this.position = [touch.pageX, -touch.pageY]; + this.position = position != null ? position.slice() : null; if(phaseId == TouchPhase.Moved) { - this.delta = [this.position[0] - state.position[0], this.position[1] - state.position[1]]; + this.delta = [this.position[0] - prevState.position[0], this.position[1] - prevState.position[1]]; } else { this.delta = [0, 0]; } - this.pressure = touch.force; - this.radius = [touch.radiusX, touch.radiusY]; + this.pressure = pressure; + this.radius = radius != null ? radius.slice(): null; this.phaseId = phaseId; this.tapCount = 0; this.displayIndex = 0; @@ -411,12 +394,27 @@ export class TouchState { this.startTime = time; this.startPosition = this.position.slice(); } else { - this.startTime = state.startTime; - this.startPosition = state.startPosition.slice(); + this.startTime = prevState != null ? prevState.startTime : null; + this.startPosition = prevState != null ? prevState.startPosition.slice() : null; } + } + - // cache state - TouchState.prevTouches[touch.identifier] = this; + copy() { + let state = new TouchState(); + state.touchId = this.touchId; + state.position = this.position.slice(); + state.delta = this.delta.slice(); + state.pressure = this.pressure; + state.radius = this.radius.slice(); + state.phaseId = this.phaseId; + state.tapCount = this.tapCount; + state.displayIndex = this.displayIndex; + state.flags = this.flags; + state.padding = this.padding; + state.startTime = this.startTime; + state.startPosition = this.startPosition.slice(); + return state; } /** @@ -451,12 +449,26 @@ export class TouchState { */ get format() { return TouchState.format; - } + } } export class TouchscreenState extends IInputState { - static get maxTouches() { return 10; } + static get maxTouches() { return 10; } static get format() { return new FourCC('T', 'S', 'C', 'R').toInt32(); } + static convertPhaseId(type) { + let phaseId = TouchPhase.Stationary; + switch(type) { + case 'touchstart': + phaseId = TouchPhase.Began; break; + case 'touchend': + phaseId = TouchPhase.Ended; break; + case 'touchmove': + phaseId = TouchPhase.Moved; break; + case 'touchcancel': + phaseId = TouchPhase.Canceled; break; + } + return phaseId; + } /** * @param {TouchEvent} event @@ -467,6 +479,7 @@ export class TouchscreenState extends IInputState { super(); switch(event.type) { + // `click` event is called when releasing mouse button or finger on screen. case 'click' : { this.touchData = new Array(state.touchData.length); for(let i = 0; i < state.touchData.length; i++) { @@ -482,7 +495,21 @@ export class TouchscreenState extends IInputState { let touches = event.changedTouches; this.touchData = new Array(touches.length); for(let i = 0; i < touches.length; i++) { - this.touchData[i] = new TouchState(touches[i], event.type, time); + const touch = touches[i]; + const position = [touch.clientX, touch.clientY]; + const phaseId = TouchscreenState.convertPhaseId(event.type); + const pressure = touch.force; + const radius = [touch.radiusX, touch.radiusY]; + + // `touchId` in InputSystem must be set uniquely. + // The numbers of `touch.identifier` in Web API are reused, so these are not unique. + const touchId = phaseId == TouchPhase.Began ? TouchState.incrementTouchId() : TouchState.prevTouches()[touch.identifier].touchId; + const prevState = phaseId != TouchPhase.Began ? TouchState.prevTouches()[touch.identifier] : null; + const touchData = new TouchState(touchId, prevState, position, pressure, radius, phaseId, time); + + // cache state + TouchState.prevTouches()[touch.identifier] = touchData; + this.touchData[i] = touchData; } break; } @@ -513,27 +540,27 @@ export class TouchscreenState extends IInputState { export class GamepadState extends IInputState { static get size() { return 28; } static get format() { return new FourCC('G', 'P', 'A', 'D').toInt32(); } - + /** * field offset 0 * @member buttons; - * + * * field offset 4 * @member leftStick; - * + * * field offset 12 * @member rightStick; - * + * * field offset 20 * @member leftTrigger; - * + * * field offset 24 * @member rightTrigger; */ /** - * - * @param {GamepadButtonEvent | GamepadAxisEvent} event + * + * @param {GamepadButtonEvent | GamepadAxisEvent} event */ constructor(event) { super(); @@ -545,7 +572,7 @@ export class GamepadState extends IInputState { this.rightStick = [ gamepad.axes[2], -gamepad.axes[3] ]; this.leftTrigger = buttons[6].value; this.rightTrigger = buttons[7].value; - + // see https://w3c.github.io/gamepad/#remapping MemoryHelper.writeSingleBit(this.buttons, GamepadButton.A, buttons[0].pressed); MemoryHelper.writeSingleBit(this.buttons, GamepadButton.B, buttons[1].pressed); @@ -562,7 +589,7 @@ export class GamepadState extends IInputState { MemoryHelper.writeSingleBit(this.buttons, GamepadButton.DpadUp, buttons[12].pressed); MemoryHelper.writeSingleBit(this.buttons, GamepadButton.DpadDown, buttons[13].pressed); MemoryHelper.writeSingleBit(this.buttons, GamepadButton.DpadLeft, buttons[14].pressed); - MemoryHelper.writeSingleBit(this.buttons, GamepadButton.DpadRight, buttons[15].pressed); + MemoryHelper.writeSingleBit(this.buttons, GamepadButton.DpadRight, buttons[15].pressed); } /** @@ -596,26 +623,26 @@ export class TextEvent { /** * field offset 0 * @member {InputEvent} baseEvent; - * + * * field offset 20 * @member {Number} character; */ /** - * - * @param {Number} deviceId - * @param {Number} character - * @param {Number} time + * + * @param {Number} deviceId + * @param {KeyboardEvent} event + * @param {Number} time * @returns {TextEvent} */ - static create(deviceId, character, time) { + static create(deviceId, event, time) { const eventSize = InputEvent.size + MemoryHelper.sizeOfInt; - let event = new TextEvent(); - event.baseEvent = new InputEvent(TextEvent.format, eventSize, deviceId, time); - event.character = character; - return event; + let textEvent = new TextEvent(); + textEvent.baseEvent = new InputEvent(TextEvent.format, eventSize, deviceId, time); + textEvent.character = CharNumber[event.key]; + return textEvent; } /** @@ -638,18 +665,18 @@ export class StateEvent { /** * field offset 0 * @member {InputEvent} baseEvent; - * + * * field offset 20 * @member {Number} stateFormat; - * + * * field offset 24 * @member {ArrayBuffer} stateData; */ /** - * - * @param {InputDevice} device - * @param {Number} time + * + * @param {InputDevice} device + * @param {Number} time * @returns {StateEvent} */ static from(device, time) { @@ -657,16 +684,16 @@ export class StateEvent { } /** - * - * @param {IInputState} state + * + * @param {IInputState} state * @param {Number} deviceId - * @param {Number} time + * @param {Number} time */ static fromState(state, deviceId, time) { const stateData = state.buffer; const stateSize = stateData.byteLength; const eventSize = InputEvent.size + MemoryHelper.sizeOfInt + stateSize; - + let stateEvent = new StateEvent(); stateEvent.baseEvent = new InputEvent(StateEvent.format, eventSize, deviceId, time); stateEvent.stateFormat = state.format; @@ -688,4 +715,4 @@ export class StateEvent { uint8View.set(new Uint8Array(this.stateData), InputEvent.size+MemoryHelper.sizeOfInt); return _buffer; } -} \ No newline at end of file +} diff --git a/WebApp/client/src/peer.js b/WebApp/client/src/peer.js index fcb32dd1c..92fdd6f27 100644 --- a/WebApp/client/src/peer.js +++ b/WebApp/client/src/peer.js @@ -180,7 +180,7 @@ export default class Peer extends EventTarget { try { await this.pc.addIceCandidate(candidate); } catch (e) { - if (this.pc && !this.ignoreOffer) + if (this.pc && !this.ignoreOffer) this.warn(`${this.pc} this candidate can't accept current signaling state ${this.pc.signalingState}.`); } } diff --git a/WebApp/client/src/pointercorrect.js b/WebApp/client/src/pointercorrect.js index b0ba3649e..04e0f61fe 100644 --- a/WebApp/client/src/pointercorrect.js +++ b/WebApp/client/src/pointercorrect.js @@ -5,12 +5,12 @@ export const LetterBoxType = { export class PointerCorrector { /** - * @param {Number} videoWidth + * @param {Number} videoWidth * @param {Number} videoHeight - * @param {DOMRect} rect + * @param {HTMLVideoElement} videoElem */ - constructor(videoWidth, videoHeight, rect) { - this.reset(videoWidth, videoHeight, rect); + constructor(videoWidth, videoHeight, videoElem) { + this.reset(videoWidth, videoHeight, videoElem); } /** @@ -18,14 +18,15 @@ export class PointerCorrector { * @returns {Number[]} */ map(position) { + var rect = this._videoElem.getBoundingClientRect(); const _position = new Array(2); // (1) set origin point to zero - _position[0] = position[0] - this._rect.left; - _position[1] = position[1] - this._rect.top; + _position[0] = position[0] - rect.left; + _position[1] = position[1] - rect.top; // (2) translate Unity coordinate system (reverse y-axis) - _position[1] = this._rect.height - _position[1]; + _position[1] = rect.height - _position[1]; // (3) add offset of letterbox _position[0] -= this._contentRect.x; @@ -55,42 +56,44 @@ export class PointerCorrector { } /** - * @param {DOMRect} rect + * @param {HTMLVideoElement} videoElem */ - setRect(rect) { - this._rect = rect; + setRect(videoElem) { + this._videoElem = videoElem; this._reset(); } /** - * @param {Number} videoWidth + * @param {Number} videoWidth * @param {Number} videoHeight - * @param {DOMRect} rect + * @param {HTMLVideoElement} videoElem */ - reset(videoWidth, videoHeight, rect) { + reset(videoWidth, videoHeight, videoElem) { this._videoWidth = videoWidth; this._videoHeight = videoHeight; - this._rect = rect; + this._videoElem = videoElem; this._reset(); } get letterBoxType() { const videoRatio = this._videoHeight / this._videoWidth; - const rectRatio = this._rect.height / this._rect.width; + var rect = this._videoElem.getBoundingClientRect(); + const rectRatio = rect.height / rect.width; return videoRatio > rectRatio ? LetterBoxType.Vertical : LetterBoxType.Horizontal; } get letterBoxSize() { + var rect = this._videoElem.getBoundingClientRect(); switch(this.letterBoxType) { case LetterBoxType.Horizontal: { - const ratioWidth = this._rect.width / this._videoWidth; + const ratioWidth = rect.width / this._videoWidth; const height = this._videoHeight * ratioWidth; - return (this._rect.height - height) * 0.5; + return (rect.height - height) * 0.5; } case LetterBoxType.Vertical: { - const ratioHeight = this._rect.height / this._videoHeight; + const ratioHeight = rect.height / this._videoHeight; const width = this._videoWidth * ratioHeight; - return (this._rect.width - width) * 0.5; + return (rect.width - width) * 0.5; } } throw 'invalid status'; @@ -99,16 +102,18 @@ export class PointerCorrector { /** * Returns rectangle for displaying video with the origin at the left-top of the element. * Not considered applying CSS like `object-fit`. - * @returns {Object} - */ + * @returns {Object} + */ get contentRect() { const letterBoxType = this.letterBoxType; const letterBoxSize = this.letterBoxSize; + var rect = this._videoElem.getBoundingClientRect(); + const x = letterBoxType == LetterBoxType.Vertical ? letterBoxSize : 0; const y = letterBoxType == LetterBoxType.Horizontal ? letterBoxSize : 0; - const width = letterBoxType == LetterBoxType.Vertical ? this._rect.width - letterBoxSize * 2 : this._rect.width; - const height = letterBoxType == LetterBoxType.Horizontal ? this._rect.height - letterBoxSize * 2 : this._rect.height; + const width = letterBoxType == LetterBoxType.Vertical ? rect.width - letterBoxSize * 2 : rect.width; + const height = letterBoxType == LetterBoxType.Horizontal ? rect.height - letterBoxSize * 2 : rect.height; return {x: x, y: y, width: width, height: height}; } @@ -116,4 +121,4 @@ export class PointerCorrector { _reset() { this._contentRect = this.contentRect; } -} \ No newline at end of file +} diff --git a/WebApp/client/src/renderstreaming.js b/WebApp/client/src/renderstreaming.js index ba933eeb6..0a9c42017 100644 --- a/WebApp/client/src/renderstreaming.js +++ b/WebApp/client/src/renderstreaming.js @@ -88,7 +88,7 @@ export class RenderStreaming { /** * if not set argument, a generated uuid is used. - * @param {string | null} connectionId + * @param {string | null} connectionId */ async createConnection(connectionId) { this._connectionId = connectionId ? connectionId : uuid4(); @@ -150,7 +150,7 @@ export class RenderStreaming { } /** - * @param {string} label + * @param {string} label * @returns {RTCDataChannel | null} */ createDataChannel(label) { @@ -158,13 +158,23 @@ export class RenderStreaming { } /** - * @param {MediaStreamTrack} track + * @param {MediaStreamTrack} track * @returns {RTCRtpSender | null} */ addTrack(track) { return this._peer.addTrack(this._connectionId, track); } + /** + * @param {MediaStreamTrack | string} trackOrKind + * @param {RTCRtpTransceiverInit | null} init + * @returns {RTCRtpTransceiver | null} + */ + addTransceiver(trackOrKind, init) { + return this._peer.addTransceiver(this._connectionId, trackOrKind, init); + } + + /** * @returns {RTCRtpTransceiver[] | null} */ diff --git a/WebApp/client/src/sender.js b/WebApp/client/src/sender.js index 6f3e7b1e5..f5fb66dff 100644 --- a/WebApp/client/src/sender.js +++ b/WebApp/client/src/sender.js @@ -1,4 +1,4 @@ -import { +import { Mouse, Keyboard, Gamepad, @@ -19,7 +19,7 @@ export class Sender extends LocalInputManager { this._corrector = new PointerCorrector( this._elem.videoWidth, this._elem.videoHeight, - this._elem.getBoundingClientRect() + this._elem ); //since line 27 cannot complete resize initialization but can only monitor div dimension changes, line 26 needs to be reserved @@ -36,9 +36,9 @@ export class Sender extends LocalInputManager { m_Product: "", m_Serial: "", m_Version: "", - m_Capabilities: "" - }; - this.mouse = new Mouse("Mouse", "Mouse", 1, "", descriptionMouse); + m_Capabilities: "" + }; + this.mouse = new Mouse("Mouse", "Mouse", 1, null, descriptionMouse); this._devices.push(this.mouse); this._elem.addEventListener('click', this._onMouseEvent.bind(this), false); @@ -56,9 +56,9 @@ export class Sender extends LocalInputManager { m_Product: "", m_Serial: "", m_Version: "", - m_Capabilities: "" + m_Capabilities: "" }; - this.keyboard = new Keyboard("Keyboard", "Keyboard", 2, "", descriptionKeyboard); + this.keyboard = new Keyboard("Keyboard", "Keyboard", 2, null, descriptionKeyboard); this._devices.push(this.keyboard); document.addEventListener('keyup', this._onKeyEvent.bind(this), false); @@ -75,12 +75,12 @@ export class Sender extends LocalInputManager { m_Version: "", m_Capabilities: "" }; - this.gamepad = new Gamepad("Gamepad", "Gamepad", 3, "", descriptionGamepad); + this.gamepad = new Gamepad("Gamepad", "Gamepad", 3, null, descriptionGamepad); this._devices.push(this.gamepad); window.addEventListener("gamepadconnected", this._onGamepadEvent.bind(this), false); window.addEventListener("gamepaddisconnected", this._onGamepadEvent.bind(this), false); - this._gamepadHandler = new GamepadHandler(); + this._gamepadHandler = new GamepadHandler(); this._gamepadHandler.addEventListener("gamepadupdated", this._onGamepadEvent.bind(this), false); } @@ -92,9 +92,9 @@ export class Sender extends LocalInputManager { m_Product: "", m_Serial: "", m_Version: "", - m_Capabilities: "" + m_Capabilities: "" }; - this.touchscreen = new Touchscreen("Touchscreen", "Touchscreen", 4, "", descriptionTouch); + this.touchscreen = new Touchscreen("Touchscreen", "Touchscreen", 4, null, descriptionTouch); this._devices.push(this.touchscreen); this._elem.addEventListener('touchend', this._onTouchEvent.bind(this), false); @@ -115,7 +115,7 @@ export class Sender extends LocalInputManager { this._corrector.reset( this._elem.videoWidth, this._elem.videoHeight, - this._elem.getBoundingClientRect() + this._elem ); } _onMouseEvent(event) { @@ -134,8 +134,7 @@ export class Sender extends LocalInputManager { this._queueStateEvent(this.keyboard.currentState, this.keyboard); } // TextEvent - const key = event.key.charCodeAt(0); - this._queueTextEvent(this.keyboard, key); + this._queueTextEvent(this.keyboard, event); } else if(event.type == 'keyup') { this.keyboard.queueEvent(event); @@ -145,7 +144,9 @@ export class Sender extends LocalInputManager { _onTouchEvent(event) { this.touchscreen.queueEvent(event, this.timeSinceStartup); for(let touch of this.touchscreen.currentState.touchData) { - this._queueStateEvent(touch, this.touchscreen); + let clone = touch.copy(); + clone.position = this._corrector.map(clone.position); + this._queueStateEvent(clone, this.touchscreen); } } _onGamepadEvent(event) { @@ -160,21 +161,21 @@ export class Sender extends LocalInputManager { } case 'gamepadupdated': { this.gamepad.queueEvent(event); - this._queueStateEvent(this.gamepad.currentState, this.gamepad); + this._queueStateEvent(this.gamepad.currentState, this.gamepad); break; } } } _queueStateEvent(state, device) { - const stateEvent = + const stateEvent = StateEvent.fromState(state, device.deviceId, this.timeSinceStartup); const e = new CustomEvent( 'event', {detail: { event: stateEvent, device: device}}); super.onEvent.dispatchEvent(e); } - _queueTextEvent(device, character) { - const textEvent = TextEvent.create(device.deviceId, character, this.timeSinceStartup); + _queueTextEvent(device, event) { + const textEvent = TextEvent.create(device.deviceId, event, this.timeSinceStartup); const e = new CustomEvent( 'event', {detail: { event: textEvent, device: device}}); super.onEvent.dispatchEvent(e); @@ -188,15 +189,15 @@ export class Sender extends LocalInputManager { export class Observer { /** - * - * @param {RTCDataChannel} channel + * + * @param {RTCDataChannel} channel */ constructor(channel) { - this.channel = channel; + this.channel = channel; } /** - * - * @param {Message} message + * + * @param {Message} message */ onNext(message) { if(this.channel == null || this.channel.readyState != 'open') { @@ -204,4 +205,4 @@ export class Observer { } this.channel.send(message.buffer); } -} \ No newline at end of file +} diff --git a/WebApp/client/src/signaling.js b/WebApp/client/src/signaling.js index 12d000d3a..6b79d653f 100644 --- a/WebApp/client/src/signaling.js +++ b/WebApp/client/src/signaling.js @@ -2,9 +2,10 @@ import * as Logger from "./logger.js"; export class Signaling extends EventTarget { - constructor() { + constructor(interval = 1000) { super(); this.running = false; + this.interval = interval; this.sleep = msec => new Promise(resolve => setTimeout(resolve, msec)); } @@ -17,10 +18,6 @@ export class Signaling extends EventTarget { } } - get interval() { - return 1000; - } - url(method, parameter='') { let ret = location.origin + '/signaling'; if(method) @@ -53,9 +50,9 @@ export class Signaling extends EventTarget { let lastTimeRequest = Date.now() - 30000; while (this.running) { const res = await this.getAll(lastTimeRequest); - lastTimeRequest = Date.parse(res.headers.get('Date')); - const data = await res.json(); + lastTimeRequest = data.datetime ? data.datetime : Date.now(); + const messages = data.messages; for(const msg of messages) { @@ -76,94 +73,8 @@ export class Signaling extends EventTarget { break; default: break; - } - } - await this.sleep(this.interval); - } - } - - async loopGetConnection() { - let currentConnections = new Set(); - while (this.running) { - const res = await this.getConnection(); - const data = await res.json(); - const connections = data.connections; - Logger.log('get connections:', connections); - - const newSet = new Set(); - connections.forEach(e => newSet.add(e.connectionId)); - const deleteConnection = new Set([...currentConnections].filter(e => (!newSet.has(e)))); - - deleteConnection.forEach(connection => { - this.dispatchEvent(new CustomEvent('disconnect', { detail: { connectionId: connection } })); - currentConnections.delete(connection); - }); - - newSet.forEach(e => currentConnections.add(e)); - - await this.sleep(this.interval); - } - } - - async loopGetOffer() { - let lastTimeRequest = Date.now() - 30000; - - while (this.running) { - const res = await this.getOffer(lastTimeRequest); - lastTimeRequest = Date.parse(res.headers.get('Date')); - - const data = await res.json(); - const offers = data.offers; - Logger.log('get offers:', offers); - - offers.forEach(offer => { - this.dispatchEvent(new CustomEvent('offer', { detail: offer })); - }); - - await this.sleep(this.interval); - } - } - - async loopGetAnswer() { - // receive answer message from 30secs ago - let lastTimeRequest = Date.now() - 30000; - - while (this.running) { - const res = await this.getAnswer(lastTimeRequest); - lastTimeRequest = Date.parse(res.headers.get('Date')); - - const data = await res.json(); - const answers = data.answers; - Logger.log('get answers:', answers); - - answers.forEach(answer => { - this.dispatchEvent(new CustomEvent('answer', { detail: answer })); - }); - - await this.sleep(this.interval); - } - } - - async loopGetCandidate() { - // receive answer message from 30secs ago - let lastTimeRequest = Date.now() - 30000; - - while (this.running) { - const res = await this.getCandidate(lastTimeRequest); - lastTimeRequest = Date.parse(res.headers.get('Date')); - - const data = await res.json(); - const candidates = data.candidates; - Logger.log('get candidates:', candidates); - - if (candidates.length > 0) { - const connectionId = candidates[0].connectionId; - for (let candidate of candidates[0].candidates) { - const dispatch = { connectionId: connectionId, candidate: candidate.candidate, sdpMLineIndex: candidate.sdpMLineIndex, sdpMid: candidate.sdpMid }; - this.dispatchEvent(new CustomEvent('candidate', { detail: dispatch })); } } - await this.sleep(this.interval); } } @@ -215,22 +126,6 @@ export class Signaling extends EventTarget { await fetch(this.url('candidate'), { method: 'POST', headers: this.headers(), body: JSON.stringify(data) }); } - async getConnection() { - return await fetch(this.url(`connection`), { method: 'GET', headers: this.headers() }); - } - - async getOffer(fromTime = 0) { - return await fetch(this.url(`offer`, `fromtime=${fromTime}`), { method: 'GET', headers: this.headers() }); - } - - async getAnswer(fromTime = 0) { - return await fetch(this.url(`answer`, `fromtime=${fromTime}`), { method: 'GET', headers: this.headers() }); - } - - async getCandidate(fromTime = 0) { - return await fetch(this.url(`candidate`, `fromtime=${fromTime}`), { method: 'GET', headers: this.headers() }); - } - async getAll(fromTime = 0) { return await fetch(this.url(``, `fromtime=${fromTime}`), { method: 'GET', headers: this.headers() }); } @@ -238,8 +133,9 @@ export class Signaling extends EventTarget { export class WebSocketSignaling extends EventTarget { - constructor() { + constructor(interval = 1000) { super(); + this.interval = interval; this.sleep = msec => new Promise(resolve => setTimeout(resolve, msec)); let websocketUrl; @@ -290,10 +186,6 @@ export class WebSocketSignaling extends EventTarget { }; } - get interval() { - return 100; - } - async start() { while (!this.isWsOpen) { await this.sleep(100); @@ -344,4 +236,4 @@ export class WebSocketSignaling extends EventTarget { Logger.log(sendJson); this.websocket.send(sendJson); } -} \ No newline at end of file +} diff --git a/WebApp/client/src/touchflags.js b/WebApp/client/src/touchflags.js index 39d469b42..154ea6447 100644 --- a/WebApp/client/src/touchflags.js +++ b/WebApp/client/src/touchflags.js @@ -4,4 +4,4 @@ export const TouchFlags = PrimaryTouch: 1 << 4, Tap: 1 << 5, OrphanedPrimaryTouch: 1 << 6, -}; \ No newline at end of file +}; diff --git a/WebApp/client/src/touchphase.js b/WebApp/client/src/touchphase.js index 01a4b4df5..e461dcda0 100644 --- a/WebApp/client/src/touchphase.js +++ b/WebApp/client/src/touchphase.js @@ -5,4 +5,4 @@ export const TouchPhase = { Ended: 3, Canceled: 4, Stationary: 5 - }; \ No newline at end of file + }; diff --git a/WebApp/client/test/domvideoelement.js b/WebApp/client/test/domvideoelement.js new file mode 100644 index 000000000..858f7d7c7 --- /dev/null +++ b/WebApp/client/test/domvideoelement.js @@ -0,0 +1,11 @@ +// mock class + +export class DOMHTMLVideoElement { + constructor(rect) { + this.rect = rect; + } + + getBoundingClientRect() { + return this.rect; + } +} diff --git a/WebApp/client/test/inputdevice.test.js b/WebApp/client/test/inputdevice.test.js index f28aecdf0..5d39ab020 100644 --- a/WebApp/client/test/inputdevice.test.js +++ b/WebApp/client/test/inputdevice.test.js @@ -25,15 +25,15 @@ describe(`MouseState`, () => { let event; beforeEach(() => { event = new MouseEvent('click', { buttons:1, clientX:0, clientY:0}); - }); + }); test('format', () => { const format = new MouseState(event).format; expect(format).toBe(0x4d4f5553); - }); + }); test('buffer', () => { const state = new MouseState(event); expect(state.buffer.byteLength).toBeGreaterThan(0); - }); + }); }); describe(`with WheelEvent`, () => { let event; @@ -43,11 +43,11 @@ describe(`MouseState`, () => { test('format', () => { const format = new MouseState(event).format; expect(format).toBe(0x4d4f5553); - }); + }); test('buffer', () => { const state = new MouseState(event); expect(state.buffer.byteLength).toBeGreaterThan(0); - }); + }); }); }); @@ -59,7 +59,7 @@ describe(`KeyboardState`, () => { test('format', () => { const format = new KeyboardState(event).format; expect(format).toBe(0x4b455953); - }); + }); test('buffer', () => { const state = new KeyboardState(event); expect(state.buffer.byteLength).toBeGreaterThan(0); @@ -69,7 +69,7 @@ describe(`KeyboardState`, () => { describe(`TouchscreenState`, () => { let event; beforeEach(() => { - event = new TouchEvent("touchstart", { + event = new TouchEvent("touchstart", { changedTouches: [{ // InputInit identifier: 0, target: null, @@ -88,7 +88,7 @@ describe(`TouchscreenState`, () => { touchType: "direct" }] }); - }); + }); test('format', () => { const format = new TouchscreenState(event, null, Date.now()).format; expect(format).toBe(0x54534352); @@ -113,7 +113,7 @@ describe(`GamepadState`, () => { test('format', () => { const format = new GamepadState(event).format; expect(format).toBe(0x47504144); - }); + }); test('buffer', () => { const state = new GamepadState(event); expect(state.buffer.byteLength).toBeGreaterThan(0); @@ -134,14 +134,15 @@ describe(`StateEvent`, () => { describe(`TextEvent`, () => { test('buffer', () => { - const character = 0x41; - const textEvent = TextEvent.create(0, character, Date.now()); + const event = new KeyboardEvent('keydown', { code: 'KeyA', key: "a"}); + const textEvent = TextEvent.create(0, event, Date.now()); expect(new Int32Array(textEvent.buffer.slice(0, 4))[0]).toBe(TextEvent.format); const offset = InputEvent.size; - expect(new Uint32Array(textEvent.buffer.slice(offset, offset+4))[0]).toBe(character); + // 'a' is 97 + expect(new Uint32Array(textEvent.buffer.slice(offset, offset+4))[0]).toBe(97); }); }); - + describe(`Mouse`, () => { test('alignedSizeInBytes', () => { let device = new Mouse("Mouse", "Mouse", 1, null, null); @@ -168,4 +169,4 @@ describe(`Gamepad`, () => { let device = new Gamepad("Gamepad", "Gamepad", 1, null, null); expect(device).toBeInstanceOf(Gamepad); }); -}); \ No newline at end of file +}); diff --git a/WebApp/client/test/mocksignaling.js b/WebApp/client/test/mocksignaling.js index 05fd52206..e82d66c1b 100644 --- a/WebApp/client/test/mocksignaling.js +++ b/WebApp/client/test/mocksignaling.js @@ -9,8 +9,9 @@ export function reset(isPrivate) { export class MockSignaling extends EventTarget { - get interval() { - return 100; + constructor(interval = 1000) { + super(); + this.interval = interval; } async start() { @@ -115,7 +116,7 @@ class MockPrivateSignalingManager { constructor() { // structure Map> connectionIds this.connectionIds = new Map(); - this.delay = () => new Promise(resolve => setTimeout(resolve, 10)); + this.delay = async () => await sleep(10); } async add(signaling) { diff --git a/WebApp/client/test/pointercorrect.test.js b/WebApp/client/test/pointercorrect.test.js index 8334ec510..d85857fa2 100644 --- a/WebApp/client/test/pointercorrect.test.js +++ b/WebApp/client/test/pointercorrect.test.js @@ -1,26 +1,30 @@ -import { +import { LetterBoxType, PointerCorrector } from "../src/pointercorrect.js"; import {DOMRect} from "./domrect.js"; +import {DOMHTMLVideoElement} from "./domvideoelement.js"; describe(`PointerCorrector.map`, () => { test('letterboxType', () => { const rect = new DOMRect(10, 10, 200, 200); - let corrector = new PointerCorrector(50, 100, rect); + const element = new DOMHTMLVideoElement(rect); + let corrector = new PointerCorrector(50, 100, element); expect(corrector.letterBoxType).toBe(LetterBoxType.Vertical); - corrector.reset(100, 50, rect); + corrector.reset(100, 50, element); expect(corrector.letterBoxType).toBe(LetterBoxType.Horizontal); }); test('letterboxSize', () => { const rect = new DOMRect(0, 0, 100, 100); - let corrector = new PointerCorrector(50, 100, rect); + const element = new DOMHTMLVideoElement(rect); + let corrector = new PointerCorrector(50, 100, element); expect(corrector.letterBoxSize).toBe(25); }); test('contentRect', () => { const rect = new DOMRect(0, 0, 100, 100); - let corrector = new PointerCorrector(50, 100, rect); + const element = new DOMHTMLVideoElement(rect); + let corrector = new PointerCorrector(50, 100, element); expect(corrector.contentRect.x).toBe(25); expect(corrector.contentRect.y).toBe(0); expect(corrector.contentRect.width).toBe(50); @@ -28,13 +32,14 @@ describe(`PointerCorrector.map`, () => { }); test('mapping', () => { const rect = new DOMRect(10, 10, 200, 200); + const element = new DOMHTMLVideoElement(rect); const videoWidth = 100; const videoHeight = 100; - let corrector = new PointerCorrector(videoWidth, videoHeight, rect); + let corrector = new PointerCorrector(videoWidth, videoHeight, element); const position = [10, 10]; const newPosition = corrector.map(position); expect(newPosition[0]).toBe(0); expect(newPosition[1]).toBe(100); }); -}); \ No newline at end of file +}); diff --git a/WebApp/client/test/signaling.test.js b/WebApp/client/test/signaling.test.js index 04a64fdb0..5ed9e7303 100644 --- a/WebApp/client/test/signaling.test.js +++ b/WebApp/client/test/signaling.test.js @@ -23,25 +23,25 @@ describe.each([ beforeAll(async () => { if (mode == "mock") { reset(false); - signaling1 = new MockSignaling(); - signaling2 = new MockSignaling(); + signaling1 = new MockSignaling(1); + signaling2 = new MockSignaling(1); } else { const path = Path.resolve(`../bin~/${serverExeName()}`); let cmd = `${path} -p ${portNumber}`; - if (mode == "websocket") { - cmd += " -w"; + if (mode == "http") { + cmd += " -t http"; } await setup({ command: cmd, port: portNumber, usedPortAction: 'error' }); if (mode == "http") { - signaling1 = new Signaling(); - signaling2 = new Signaling(); + signaling1 = new Signaling(1); + signaling2 = new Signaling(1); } if (mode == "websocket") { - signaling1 = new WebSocketSignaling(); - signaling2 = new WebSocketSignaling(); + signaling1 = new WebSocketSignaling(1); + signaling2 = new WebSocketSignaling(1); } } @@ -221,27 +221,27 @@ describe.each([ beforeAll(async () => { if (mode == "mock") { reset(true); - signaling1 = new MockSignaling(); - signaling2 = new MockSignaling(); + signaling1 = new MockSignaling(1); + signaling2 = new MockSignaling(1); return; } const path = Path.resolve(`../bin~/${serverExeName()}`); let cmd = `${path} -p ${portNumber} -m private`; - if (mode == "websocket") { - cmd += " -w"; + if (mode == "http") { + cmd += " -t http"; } await setup({ command: cmd, port: portNumber, usedPortAction: 'error' }); if (mode == "http") { - signaling1 = new Signaling(); - signaling2 = new Signaling(); + signaling1 = new Signaling(1); + signaling2 = new Signaling(1); } if (mode == "websocket") { - signaling1 = new WebSocketSignaling(); - signaling2 = new WebSocketSignaling(); + signaling1 = new WebSocketSignaling(1); + signaling2 = new WebSocketSignaling(1); } await signaling1.start(); @@ -455,6 +455,7 @@ describe.each([ signaling1.addEventListener('offer', (e) => offerRes1 = e.detail); signaling2.addEventListener('offer', (e) => offerRes2 = e.detail); await signaling1.sendOffer(connectionId, testsdp); + await waitFor(() => offerRes2 != null); await sleep(signaling1.interval * 2); expect(offerRes1).toBeUndefined(); expect(offerRes2).not.toBeUndefined(); @@ -464,6 +465,7 @@ describe.each([ signaling1.addEventListener('answer', (e) => answerRes1 = e.detail); signaling2.addEventListener('answer', (e) => answerRes2 = e.detail); await signaling2.sendAnswer(connectionId, testsdp); + await waitFor(() => answerRes1 != null); await sleep(signaling2.interval * 2); expect(answerRes1).not.toBeUndefined(); expect(answerRes1.connectionId).toBe(connectionId); diff --git a/WebApp/package-lock.json b/WebApp/package-lock.json index 425ef09b3..dca2e83bc 100644 --- a/WebApp/package-lock.json +++ b/WebApp/package-lock.json @@ -11,6 +11,7 @@ "@types/express": "^4.17.13", "@types/node": "^18.7.15", "@types/ws": "^8.5.3", + "cors": "^2.8.5", "debug": "~4.3.4", "express": "~4.18.1", "morgan": "^1.10.0", @@ -22,7 +23,7 @@ }, "devDependencies": { "@jest-mock/express": "^2.0.1", - "@types/jest": "^29.0.0", + "@types/jest": "^29.0.2", "@types/morgan": "^1.9.3", "@typescript-eslint/eslint-plugin": "^5.36.2", "@typescript-eslint/parser": "^5.36.2", @@ -31,9 +32,9 @@ "jest": "^29.0.2", "jest-websocket-mock": "^2.4.0", "mock-socket": "^9.1.5", - "newman": "^5.3.2", + "newman": "^6.0.0", "pkg": "^5.8.0", - "ts-jest": "^28.0.8", + "ts-jest": "^29.0.2", "ts-node": "^10.9.1", "typescript": "^4.8.2" } @@ -52,17 +53,89 @@ } }, "node_modules/@babel/code-frame": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.16.7.tgz", - "integrity": "sha512-iAXqUn8IIeBTNd72xsFlgaXHkMBMt6y4HJp1tIaK465CWLT/fG1aqB7ykr95gHHmlBdGbFeWWfyB4NJJ0nmeIg==", + "version": "7.22.13", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.22.13.tgz", + "integrity": "sha512-XktuhWlJ5g+3TJXc5upd9Ks1HutSArik6jf2eAjYFyIOf4ej3RN+184cZbzDvbPnuTJIUhPKKJE3cIsYTiAT3w==", "dev": true, "dependencies": { - "@babel/highlight": "^7.16.7" + "@babel/highlight": "^7.22.13", + "chalk": "^2.4.2" }, "engines": { "node": ">=6.9.0" } }, + "node_modules/@babel/code-frame/node_modules/ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "dev": true, + "dependencies": { + "color-convert": "^1.9.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/@babel/code-frame/node_modules/chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "dev": true, + "dependencies": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/@babel/code-frame/node_modules/color-convert": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "dev": true, + "dependencies": { + "color-name": "1.1.3" + } + }, + "node_modules/@babel/code-frame/node_modules/color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", + "dev": true + }, + "node_modules/@babel/code-frame/node_modules/escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", + "dev": true, + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/@babel/code-frame/node_modules/has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/@babel/code-frame/node_modules/supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dev": true, + "dependencies": { + "has-flag": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, "node_modules/@babel/compat-data": { "version": "7.17.10", "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.17.10.tgz", @@ -167,34 +240,62 @@ } }, "node_modules/@babel/helper-environment-visitor": { - "version": "7.18.2", - "resolved": "https://registry.npmjs.org/@babel/helper-environment-visitor/-/helper-environment-visitor-7.18.2.tgz", - "integrity": "sha512-14GQKWkX9oJzPiQQ7/J36FTXcD4kSp8egKjO9nINlSKiHITRA9q/R74qu8S9xlc/b/yjsJItQUeeh3xnGN0voQ==", + "version": "7.22.20", + "resolved": "https://registry.npmjs.org/@babel/helper-environment-visitor/-/helper-environment-visitor-7.22.20.tgz", + "integrity": "sha512-zfedSIzFhat/gFhWfHtgWvlec0nqB9YEIVrpuwjruLlXfUSnA8cJB0miHKwqDnQ7d32aKo2xt88/xZptwxbfhA==", "dev": true, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-function-name": { - "version": "7.17.9", - "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.17.9.tgz", - "integrity": "sha512-7cRisGlVtiVqZ0MW0/yFB4atgpGLWEHUVYnb448hZK4x+vih0YO5UoS11XIYtZYqHd0dIPMdUSv8q5K4LdMnIg==", + "version": "7.23.0", + "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.23.0.tgz", + "integrity": "sha512-OErEqsrxjZTJciZ4Oo+eoZqeW9UIiOcuYKRJA4ZAgV9myA+pOXhhmpfNCKjEH/auVfEYVFJ6y1Tc4r0eIApqiw==", "dev": true, "dependencies": { - "@babel/template": "^7.16.7", - "@babel/types": "^7.17.0" + "@babel/template": "^7.22.15", + "@babel/types": "^7.23.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-function-name/node_modules/@babel/types": { + "version": "7.23.0", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.23.0.tgz", + "integrity": "sha512-0oIyUfKoI3mSqMvsxBdclDwxXKXAUA8v/apZbc+iSyARYou1o8ZGDxbUYyLFoW2arqS2jDGqJuZvv1d/io1axg==", + "dev": true, + "dependencies": { + "@babel/helper-string-parser": "^7.22.5", + "@babel/helper-validator-identifier": "^7.22.20", + "to-fast-properties": "^2.0.0" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-hoist-variables": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.16.7.tgz", - "integrity": "sha512-m04d/0Op34H5v7pbZw6pSKP7weA6lsMvfiIAMeIvkY/R4xQtBSMFEigu9QTZ2qB/9l22vsxtM8a+Q8CzD255fg==", + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.22.5.tgz", + "integrity": "sha512-wGjk9QZVzvknA6yKIUURb8zY3grXCcOZt+/7Wcy8O2uctxhplmUPkOdlgoNhmdVee2c92JXbf1xpMtVNbfoxRw==", "dev": true, "dependencies": { - "@babel/types": "^7.16.7" + "@babel/types": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-hoist-variables/node_modules/@babel/types": { + "version": "7.23.0", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.23.0.tgz", + "integrity": "sha512-0oIyUfKoI3mSqMvsxBdclDwxXKXAUA8v/apZbc+iSyARYou1o8ZGDxbUYyLFoW2arqS2jDGqJuZvv1d/io1axg==", + "dev": true, + "dependencies": { + "@babel/helper-string-parser": "^7.22.5", + "@babel/helper-validator-identifier": "^7.22.20", + "to-fast-properties": "^2.0.0" }, "engines": { "node": ">=6.9.0" @@ -253,21 +354,44 @@ } }, "node_modules/@babel/helper-split-export-declaration": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.16.7.tgz", - "integrity": "sha512-xbWoy/PFoxSWazIToT9Sif+jJTlrMcndIsaOKvTA6u7QEo7ilkRZpjew18/W3c7nm8fXdUDXh02VXTbZ0pGDNw==", + "version": "7.22.6", + "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.22.6.tgz", + "integrity": "sha512-AsUnxuLhRYsisFiaJwvp1QF+I3KjD5FOxut14q/GzovUe6orHLesW2C7d754kRm53h5gqrz6sFl6sxc4BVtE/g==", "dev": true, "dependencies": { - "@babel/types": "^7.16.7" + "@babel/types": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-split-export-declaration/node_modules/@babel/types": { + "version": "7.23.0", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.23.0.tgz", + "integrity": "sha512-0oIyUfKoI3mSqMvsxBdclDwxXKXAUA8v/apZbc+iSyARYou1o8ZGDxbUYyLFoW2arqS2jDGqJuZvv1d/io1axg==", + "dev": true, + "dependencies": { + "@babel/helper-string-parser": "^7.22.5", + "@babel/helper-validator-identifier": "^7.22.20", + "to-fast-properties": "^2.0.0" }, "engines": { "node": ">=6.9.0" } }, + "node_modules/@babel/helper-string-parser": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.22.5.tgz", + "integrity": "sha512-mM4COjgZox8U+JcXQwPijIZLElkgEpO5rsERVDJTc2qfCDfERyob6k5WegS14SX18IIjv+XD+GrqNumY5JRCDw==", + "dev": true, + "engines": { + "node": ">=6.9.0" + } + }, "node_modules/@babel/helper-validator-identifier": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.16.7.tgz", - "integrity": "sha512-hsEnFemeiW4D08A5gUAZxLBTXpZ39P+a+DGDsHw1yxqyQ/jzFEnxf5uTEGp+3bzAbNOxU1paTgYS4ECU/IgfDw==", + "version": "7.22.20", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.22.20.tgz", + "integrity": "sha512-Y4OZ+ytlatR8AI+8KZfKuL5urKp7qey08ha31L8b3BwewJAoJamTzyvxPR/5D+KkdJCGPq/+8TukHBlY10FX9A==", "dev": true, "engines": { "node": ">=6.9.0" @@ -297,13 +421,13 @@ } }, "node_modules/@babel/highlight": { - "version": "7.17.12", - "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.17.12.tgz", - "integrity": "sha512-7yykMVF3hfZY2jsHZEEgLc+3x4o1O+fYyULu11GynEUQNwB6lua+IIQn1FiJxNucd5UlyJryrwsOh8PL9Sn8Qg==", + "version": "7.22.20", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.22.20.tgz", + "integrity": "sha512-dkdMCN3py0+ksCgYmGG8jKeGA/8Tk+gJwSYYlFGxG5lmhfKNoAy004YpLxpS1W2J8m/EK2Ew+yOs9pVRwO89mg==", "dev": true, "dependencies": { - "@babel/helper-validator-identifier": "^7.16.7", - "chalk": "^2.0.0", + "@babel/helper-validator-identifier": "^7.22.20", + "chalk": "^2.4.2", "js-tokens": "^4.0.0" }, "engines": { @@ -571,33 +695,59 @@ } }, "node_modules/@babel/template": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.16.7.tgz", - "integrity": "sha512-I8j/x8kHUrbYRTUxXrrMbfCa7jxkE7tZre39x3kjr9hvI82cK1FfqLygotcWN5kdPGWcLdWMHpSBavse5tWw3w==", + "version": "7.22.15", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.22.15.tgz", + "integrity": "sha512-QPErUVm4uyJa60rkI73qneDacvdvzxshT3kksGqlGWYdOTIUOwJ7RDUL8sGqslY1uXWSL6xMFKEXDS3ox2uF0w==", "dev": true, "dependencies": { - "@babel/code-frame": "^7.16.7", - "@babel/parser": "^7.16.7", - "@babel/types": "^7.16.7" + "@babel/code-frame": "^7.22.13", + "@babel/parser": "^7.22.15", + "@babel/types": "^7.22.15" }, "engines": { "node": ">=6.9.0" } }, - "node_modules/@babel/traverse": { - "version": "7.18.2", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.18.2.tgz", - "integrity": "sha512-9eNwoeovJ6KH9zcCNnENY7DMFwTU9JdGCFtqNLfUAqtUHRCOsTOqWoffosP8vKmNYeSBUv3yVJXjfd8ucwOjUA==", + "node_modules/@babel/template/node_modules/@babel/parser": { + "version": "7.23.0", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.23.0.tgz", + "integrity": "sha512-vvPKKdMemU85V9WE/l5wZEmImpCtLqbnTvqDS2U1fJ96KrxoW7KrXhNsNCblQlg8Ck4b85yxdTyelsMUgFUXiw==", + "dev": true, + "bin": { + "parser": "bin/babel-parser.js" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@babel/template/node_modules/@babel/types": { + "version": "7.23.0", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.23.0.tgz", + "integrity": "sha512-0oIyUfKoI3mSqMvsxBdclDwxXKXAUA8v/apZbc+iSyARYou1o8ZGDxbUYyLFoW2arqS2jDGqJuZvv1d/io1axg==", "dev": true, "dependencies": { - "@babel/code-frame": "^7.16.7", - "@babel/generator": "^7.18.2", - "@babel/helper-environment-visitor": "^7.18.2", - "@babel/helper-function-name": "^7.17.9", - "@babel/helper-hoist-variables": "^7.16.7", - "@babel/helper-split-export-declaration": "^7.16.7", - "@babel/parser": "^7.18.0", - "@babel/types": "^7.18.2", + "@babel/helper-string-parser": "^7.22.5", + "@babel/helper-validator-identifier": "^7.22.20", + "to-fast-properties": "^2.0.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/traverse": { + "version": "7.23.2", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.23.2.tgz", + "integrity": "sha512-azpe59SQ48qG6nu2CzcMLbxUudtN+dOM9kDbUqGq3HXUJRlo7i8fvPoxQUzYgLZ4cMVmuZgm8vvBpNeRhd6XSw==", + "dev": true, + "dependencies": { + "@babel/code-frame": "^7.22.13", + "@babel/generator": "^7.23.0", + "@babel/helper-environment-visitor": "^7.22.20", + "@babel/helper-function-name": "^7.23.0", + "@babel/helper-hoist-variables": "^7.22.5", + "@babel/helper-split-export-declaration": "^7.22.6", + "@babel/parser": "^7.23.0", + "@babel/types": "^7.23.0", "debug": "^4.1.0", "globals": "^11.1.0" }, @@ -605,6 +755,61 @@ "node": ">=6.9.0" } }, + "node_modules/@babel/traverse/node_modules/@babel/generator": { + "version": "7.23.0", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.23.0.tgz", + "integrity": "sha512-lN85QRR+5IbYrMWM6Y4pE/noaQtg4pNiqeNGX60eqOfo6gtEj6uw/JagelB8vVztSd7R6M5n1+PQkDbHbBRU4g==", + "dev": true, + "dependencies": { + "@babel/types": "^7.23.0", + "@jridgewell/gen-mapping": "^0.3.2", + "@jridgewell/trace-mapping": "^0.3.17", + "jsesc": "^2.5.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/traverse/node_modules/@babel/parser": { + "version": "7.23.0", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.23.0.tgz", + "integrity": "sha512-vvPKKdMemU85V9WE/l5wZEmImpCtLqbnTvqDS2U1fJ96KrxoW7KrXhNsNCblQlg8Ck4b85yxdTyelsMUgFUXiw==", + "dev": true, + "bin": { + "parser": "bin/babel-parser.js" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@babel/traverse/node_modules/@babel/types": { + "version": "7.23.0", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.23.0.tgz", + "integrity": "sha512-0oIyUfKoI3mSqMvsxBdclDwxXKXAUA8v/apZbc+iSyARYou1o8ZGDxbUYyLFoW2arqS2jDGqJuZvv1d/io1axg==", + "dev": true, + "dependencies": { + "@babel/helper-string-parser": "^7.22.5", + "@babel/helper-validator-identifier": "^7.22.20", + "to-fast-properties": "^2.0.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/traverse/node_modules/@jridgewell/gen-mapping": { + "version": "0.3.3", + "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.3.tgz", + "integrity": "sha512-HLhSWOLRi875zjjMG/r+Nv0oCW8umGb0BgEhyX3dDX3egwZtB8PqLnjz3yedt8R5StBrzcg4aBpnh8UA9D1BoQ==", + "dev": true, + "dependencies": { + "@jridgewell/set-array": "^1.0.1", + "@jridgewell/sourcemap-codec": "^1.4.10", + "@jridgewell/trace-mapping": "^0.3.9" + }, + "engines": { + "node": ">=6.0.0" + } + }, "node_modules/@babel/traverse/node_modules/globals": { "version": "11.12.0", "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz", @@ -633,6 +838,16 @@ "integrity": "sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw==", "dev": true }, + "node_modules/@colors/colors": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/@colors/colors/-/colors-1.5.0.tgz", + "integrity": "sha512-ooWCrlZP11i8GImSjTHYHLkvFDP48nS4+204nGb1RiX/WXYHmJA2III9/e2DWVabCESdW7hBAEzHRqUn9OUVvQ==", + "dev": true, + "optional": true, + "engines": { + "node": ">=0.1.90" + } + }, "node_modules/@cspotcode/source-map-support": { "version": "0.8.1", "resolved": "https://registry.npmjs.org/@cspotcode/source-map-support/-/source-map-support-0.8.1.tgz", @@ -678,6 +893,12 @@ "url": "https://opencollective.com/eslint" } }, + "node_modules/@faker-js/faker": { + "version": "5.5.3", + "resolved": "https://registry.npmjs.org/@faker-js/faker/-/faker-5.5.3.tgz", + "integrity": "sha512-R11tGE6yIFwqpaIqcfkcg7AICXzFg14+5h5v0TfF/9+RMDL6jhzCy/pxHVOfbALGdtVYdt6JdR21tuxEgl34dw==", + "dev": true + }, "node_modules/@humanwhocodes/config-array": { "version": "0.10.4", "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.10.4.tgz", @@ -803,52 +1024,6 @@ "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, - "node_modules/@jest/console/node_modules/@jest/schemas": { - "version": "29.0.0", - "resolved": "https://registry.npmjs.org/@jest/schemas/-/schemas-29.0.0.tgz", - "integrity": "sha512-3Ab5HgYIIAnS0HjqJHQYZS+zXc4tUmTmBH3z83ajI6afXp8X3ZtdLX+nXx+I7LNkJD7uN9LAVhgnjDgZa2z0kA==", - "dev": true, - "dependencies": { - "@sinclair/typebox": "^0.24.1" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/@jest/console/node_modules/@jest/types": { - "version": "29.0.2", - "resolved": "https://registry.npmjs.org/@jest/types/-/types-29.0.2.tgz", - "integrity": "sha512-5WNMesBLmlkt1+fVkoCjHa0X3i3q8zc4QLTDkdHgCa2gyPZc7rdlZBWgVLqwS1860ZW5xJuCDwAzqbGaXIr/ew==", - "dev": true, - "dependencies": { - "@jest/schemas": "^29.0.0", - "@types/istanbul-lib-coverage": "^2.0.0", - "@types/istanbul-reports": "^3.0.0", - "@types/node": "*", - "@types/yargs": "^17.0.8", - "chalk": "^4.0.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/@jest/console/node_modules/jest-util": { - "version": "29.0.2", - "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-29.0.2.tgz", - "integrity": "sha512-ozk8ruEEEACxqpz0hN9UOgtPZS0aN+NffwQduR5dVlhN+eN47vxurtvgZkYZYMpYrsmlAEx1XabkB3BnN0GfKQ==", - "dev": true, - "dependencies": { - "@jest/types": "^29.0.2", - "@types/node": "*", - "chalk": "^4.0.0", - "ci-info": "^3.2.0", - "graceful-fs": "^4.2.9", - "picomatch": "^2.2.3" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, "node_modules/@jest/core": { "version": "29.0.2", "resolved": "https://registry.npmjs.org/@jest/core/-/core-29.0.2.tgz", @@ -896,18 +1071,6 @@ } } }, - "node_modules/@jest/core/node_modules/@jest/schemas": { - "version": "29.0.0", - "resolved": "https://registry.npmjs.org/@jest/schemas/-/schemas-29.0.0.tgz", - "integrity": "sha512-3Ab5HgYIIAnS0HjqJHQYZS+zXc4tUmTmBH3z83ajI6afXp8X3ZtdLX+nXx+I7LNkJD7uN9LAVhgnjDgZa2z0kA==", - "dev": true, - "dependencies": { - "@sinclair/typebox": "^0.24.1" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, "node_modules/@jest/core/node_modules/@jest/transform": { "version": "29.0.2", "resolved": "https://registry.npmjs.org/@jest/transform/-/transform-29.0.2.tgz", @@ -934,23 +1097,6 @@ "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, - "node_modules/@jest/core/node_modules/@jest/types": { - "version": "29.0.2", - "resolved": "https://registry.npmjs.org/@jest/types/-/types-29.0.2.tgz", - "integrity": "sha512-5WNMesBLmlkt1+fVkoCjHa0X3i3q8zc4QLTDkdHgCa2gyPZc7rdlZBWgVLqwS1860ZW5xJuCDwAzqbGaXIr/ew==", - "dev": true, - "dependencies": { - "@jest/schemas": "^29.0.0", - "@types/istanbul-lib-coverage": "^2.0.0", - "@types/istanbul-reports": "^3.0.0", - "@types/node": "*", - "@types/yargs": "^17.0.8", - "chalk": "^4.0.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, "node_modules/@jest/core/node_modules/jest-haste-map": { "version": "29.0.2", "resolved": "https://registry.npmjs.org/jest-haste-map/-/jest-haste-map-29.0.2.tgz", @@ -985,23 +1131,6 @@ "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, - "node_modules/@jest/core/node_modules/jest-util": { - "version": "29.0.2", - "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-29.0.2.tgz", - "integrity": "sha512-ozk8ruEEEACxqpz0hN9UOgtPZS0aN+NffwQduR5dVlhN+eN47vxurtvgZkYZYMpYrsmlAEx1XabkB3BnN0GfKQ==", - "dev": true, - "dependencies": { - "@jest/types": "^29.0.2", - "@types/node": "*", - "chalk": "^4.0.0", - "ci-info": "^3.2.0", - "graceful-fs": "^4.2.9", - "picomatch": "^2.2.3" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, "node_modules/@jest/core/node_modules/jest-worker": { "version": "29.0.2", "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-29.0.2.tgz", @@ -1046,39 +1175,10 @@ "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, - "node_modules/@jest/environment/node_modules/@jest/schemas": { - "version": "29.0.0", - "resolved": "https://registry.npmjs.org/@jest/schemas/-/schemas-29.0.0.tgz", - "integrity": "sha512-3Ab5HgYIIAnS0HjqJHQYZS+zXc4tUmTmBH3z83ajI6afXp8X3ZtdLX+nXx+I7LNkJD7uN9LAVhgnjDgZa2z0kA==", - "dev": true, - "dependencies": { - "@sinclair/typebox": "^0.24.1" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/@jest/environment/node_modules/@jest/types": { - "version": "29.0.2", - "resolved": "https://registry.npmjs.org/@jest/types/-/types-29.0.2.tgz", - "integrity": "sha512-5WNMesBLmlkt1+fVkoCjHa0X3i3q8zc4QLTDkdHgCa2gyPZc7rdlZBWgVLqwS1860ZW5xJuCDwAzqbGaXIr/ew==", - "dev": true, - "dependencies": { - "@jest/schemas": "^29.0.0", - "@types/istanbul-lib-coverage": "^2.0.0", - "@types/istanbul-reports": "^3.0.0", - "@types/node": "*", - "@types/yargs": "^17.0.8", - "chalk": "^4.0.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/@jest/expect": { - "version": "29.0.2", - "resolved": "https://registry.npmjs.org/@jest/expect/-/expect-29.0.2.tgz", - "integrity": "sha512-y/3geZ92p2/zovBm/F+ZjXUJ3thvT9IRzD6igqaWskFE2aR0idD+N/p5Lj/ZautEox/9RwEc6nqergebeh72uQ==", + "node_modules/@jest/expect": { + "version": "29.0.2", + "resolved": "https://registry.npmjs.org/@jest/expect/-/expect-29.0.2.tgz", + "integrity": "sha512-y/3geZ92p2/zovBm/F+ZjXUJ3thvT9IRzD6igqaWskFE2aR0idD+N/p5Lj/ZautEox/9RwEc6nqergebeh72uQ==", "dev": true, "dependencies": { "expect": "^29.0.2", @@ -1117,52 +1217,6 @@ "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, - "node_modules/@jest/fake-timers/node_modules/@jest/schemas": { - "version": "29.0.0", - "resolved": "https://registry.npmjs.org/@jest/schemas/-/schemas-29.0.0.tgz", - "integrity": "sha512-3Ab5HgYIIAnS0HjqJHQYZS+zXc4tUmTmBH3z83ajI6afXp8X3ZtdLX+nXx+I7LNkJD7uN9LAVhgnjDgZa2z0kA==", - "dev": true, - "dependencies": { - "@sinclair/typebox": "^0.24.1" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/@jest/fake-timers/node_modules/@jest/types": { - "version": "29.0.2", - "resolved": "https://registry.npmjs.org/@jest/types/-/types-29.0.2.tgz", - "integrity": "sha512-5WNMesBLmlkt1+fVkoCjHa0X3i3q8zc4QLTDkdHgCa2gyPZc7rdlZBWgVLqwS1860ZW5xJuCDwAzqbGaXIr/ew==", - "dev": true, - "dependencies": { - "@jest/schemas": "^29.0.0", - "@types/istanbul-lib-coverage": "^2.0.0", - "@types/istanbul-reports": "^3.0.0", - "@types/node": "*", - "@types/yargs": "^17.0.8", - "chalk": "^4.0.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/@jest/fake-timers/node_modules/jest-util": { - "version": "29.0.2", - "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-29.0.2.tgz", - "integrity": "sha512-ozk8ruEEEACxqpz0hN9UOgtPZS0aN+NffwQduR5dVlhN+eN47vxurtvgZkYZYMpYrsmlAEx1XabkB3BnN0GfKQ==", - "dev": true, - "dependencies": { - "@jest/types": "^29.0.2", - "@types/node": "*", - "chalk": "^4.0.0", - "ci-info": "^3.2.0", - "graceful-fs": "^4.2.9", - "picomatch": "^2.2.3" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, "node_modules/@jest/globals": { "version": "29.0.2", "resolved": "https://registry.npmjs.org/@jest/globals/-/globals-29.0.2.tgz", @@ -1178,35 +1232,6 @@ "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, - "node_modules/@jest/globals/node_modules/@jest/schemas": { - "version": "29.0.0", - "resolved": "https://registry.npmjs.org/@jest/schemas/-/schemas-29.0.0.tgz", - "integrity": "sha512-3Ab5HgYIIAnS0HjqJHQYZS+zXc4tUmTmBH3z83ajI6afXp8X3ZtdLX+nXx+I7LNkJD7uN9LAVhgnjDgZa2z0kA==", - "dev": true, - "dependencies": { - "@sinclair/typebox": "^0.24.1" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/@jest/globals/node_modules/@jest/types": { - "version": "29.0.2", - "resolved": "https://registry.npmjs.org/@jest/types/-/types-29.0.2.tgz", - "integrity": "sha512-5WNMesBLmlkt1+fVkoCjHa0X3i3q8zc4QLTDkdHgCa2gyPZc7rdlZBWgVLqwS1860ZW5xJuCDwAzqbGaXIr/ew==", - "dev": true, - "dependencies": { - "@jest/schemas": "^29.0.0", - "@types/istanbul-lib-coverage": "^2.0.0", - "@types/istanbul-reports": "^3.0.0", - "@types/node": "*", - "@types/yargs": "^17.0.8", - "chalk": "^4.0.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, "node_modules/@jest/reporters": { "version": "29.0.2", "resolved": "https://registry.npmjs.org/@jest/reporters/-/reporters-29.0.2.tgz", @@ -1251,18 +1276,6 @@ } } }, - "node_modules/@jest/reporters/node_modules/@jest/schemas": { - "version": "29.0.0", - "resolved": "https://registry.npmjs.org/@jest/schemas/-/schemas-29.0.0.tgz", - "integrity": "sha512-3Ab5HgYIIAnS0HjqJHQYZS+zXc4tUmTmBH3z83ajI6afXp8X3ZtdLX+nXx+I7LNkJD7uN9LAVhgnjDgZa2z0kA==", - "dev": true, - "dependencies": { - "@sinclair/typebox": "^0.24.1" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, "node_modules/@jest/reporters/node_modules/@jest/transform": { "version": "29.0.2", "resolved": "https://registry.npmjs.org/@jest/transform/-/transform-29.0.2.tgz", @@ -1289,23 +1302,6 @@ "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, - "node_modules/@jest/reporters/node_modules/@jest/types": { - "version": "29.0.2", - "resolved": "https://registry.npmjs.org/@jest/types/-/types-29.0.2.tgz", - "integrity": "sha512-5WNMesBLmlkt1+fVkoCjHa0X3i3q8zc4QLTDkdHgCa2gyPZc7rdlZBWgVLqwS1860ZW5xJuCDwAzqbGaXIr/ew==", - "dev": true, - "dependencies": { - "@jest/schemas": "^29.0.0", - "@types/istanbul-lib-coverage": "^2.0.0", - "@types/istanbul-reports": "^3.0.0", - "@types/node": "*", - "@types/yargs": "^17.0.8", - "chalk": "^4.0.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, "node_modules/@jest/reporters/node_modules/jest-haste-map": { "version": "29.0.2", "resolved": "https://registry.npmjs.org/jest-haste-map/-/jest-haste-map-29.0.2.tgz", @@ -1340,23 +1336,6 @@ "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, - "node_modules/@jest/reporters/node_modules/jest-util": { - "version": "29.0.2", - "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-29.0.2.tgz", - "integrity": "sha512-ozk8ruEEEACxqpz0hN9UOgtPZS0aN+NffwQduR5dVlhN+eN47vxurtvgZkYZYMpYrsmlAEx1XabkB3BnN0GfKQ==", - "dev": true, - "dependencies": { - "@jest/types": "^29.0.2", - "@types/node": "*", - "chalk": "^4.0.0", - "ci-info": "^3.2.0", - "graceful-fs": "^4.2.9", - "picomatch": "^2.2.3" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, "node_modules/@jest/reporters/node_modules/jest-worker": { "version": "29.0.2", "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-29.0.2.tgz", @@ -1427,35 +1406,6 @@ "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, - "node_modules/@jest/test-result/node_modules/@jest/schemas": { - "version": "29.0.0", - "resolved": "https://registry.npmjs.org/@jest/schemas/-/schemas-29.0.0.tgz", - "integrity": "sha512-3Ab5HgYIIAnS0HjqJHQYZS+zXc4tUmTmBH3z83ajI6afXp8X3ZtdLX+nXx+I7LNkJD7uN9LAVhgnjDgZa2z0kA==", - "dev": true, - "dependencies": { - "@sinclair/typebox": "^0.24.1" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/@jest/test-result/node_modules/@jest/types": { - "version": "29.0.2", - "resolved": "https://registry.npmjs.org/@jest/types/-/types-29.0.2.tgz", - "integrity": "sha512-5WNMesBLmlkt1+fVkoCjHa0X3i3q8zc4QLTDkdHgCa2gyPZc7rdlZBWgVLqwS1860ZW5xJuCDwAzqbGaXIr/ew==", - "dev": true, - "dependencies": { - "@jest/schemas": "^29.0.0", - "@types/istanbul-lib-coverage": "^2.0.0", - "@types/istanbul-reports": "^3.0.0", - "@types/node": "*", - "@types/yargs": "^17.0.8", - "chalk": "^4.0.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, "node_modules/@jest/test-sequencer": { "version": "29.0.2", "resolved": "https://registry.npmjs.org/@jest/test-sequencer/-/test-sequencer-29.0.2.tgz", @@ -1471,35 +1421,6 @@ "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, - "node_modules/@jest/test-sequencer/node_modules/@jest/schemas": { - "version": "29.0.0", - "resolved": "https://registry.npmjs.org/@jest/schemas/-/schemas-29.0.0.tgz", - "integrity": "sha512-3Ab5HgYIIAnS0HjqJHQYZS+zXc4tUmTmBH3z83ajI6afXp8X3ZtdLX+nXx+I7LNkJD7uN9LAVhgnjDgZa2z0kA==", - "dev": true, - "dependencies": { - "@sinclair/typebox": "^0.24.1" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/@jest/test-sequencer/node_modules/@jest/types": { - "version": "29.0.2", - "resolved": "https://registry.npmjs.org/@jest/types/-/types-29.0.2.tgz", - "integrity": "sha512-5WNMesBLmlkt1+fVkoCjHa0X3i3q8zc4QLTDkdHgCa2gyPZc7rdlZBWgVLqwS1860ZW5xJuCDwAzqbGaXIr/ew==", - "dev": true, - "dependencies": { - "@jest/schemas": "^29.0.0", - "@types/istanbul-lib-coverage": "^2.0.0", - "@types/istanbul-reports": "^3.0.0", - "@types/node": "*", - "@types/yargs": "^17.0.8", - "chalk": "^4.0.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, "node_modules/@jest/test-sequencer/node_modules/jest-haste-map": { "version": "29.0.2", "resolved": "https://registry.npmjs.org/jest-haste-map/-/jest-haste-map-29.0.2.tgz", @@ -1534,23 +1455,6 @@ "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, - "node_modules/@jest/test-sequencer/node_modules/jest-util": { - "version": "29.0.2", - "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-29.0.2.tgz", - "integrity": "sha512-ozk8ruEEEACxqpz0hN9UOgtPZS0aN+NffwQduR5dVlhN+eN47vxurtvgZkYZYMpYrsmlAEx1XabkB3BnN0GfKQ==", - "dev": true, - "dependencies": { - "@jest/types": "^29.0.2", - "@types/node": "*", - "chalk": "^4.0.0", - "ci-info": "^3.2.0", - "graceful-fs": "^4.2.9", - "picomatch": "^2.2.3" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, "node_modules/@jest/test-sequencer/node_modules/jest-worker": { "version": "29.0.2", "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-29.0.2.tgz", @@ -1581,12 +1485,12 @@ } }, "node_modules/@jest/types": { - "version": "28.1.3", - "resolved": "https://registry.npmjs.org/@jest/types/-/types-28.1.3.tgz", - "integrity": "sha512-RyjiyMUZrKz/c+zlMFO1pm70DcIlST8AeWTkoUdZevew44wcNZQHsEVOiCVtgVnlFFD82FPaXycys58cf2muVQ==", + "version": "29.6.1", + "resolved": "https://registry.npmmirror.com/@jest/types/-/types-29.6.1.tgz", + "integrity": "sha512-tPKQNMPuXgvdOn2/Lg9HNfUvjYVGolt04Hp03f5hAk878uwOLikN+JzeLY0HcVgKgFl9Hs3EIqpu3WX27XNhnw==", "dev": true, "dependencies": { - "@jest/schemas": "^28.1.3", + "@jest/schemas": "^29.6.0", "@types/istanbul-lib-coverage": "^2.0.0", "@types/istanbul-reports": "^3.0.0", "@types/node": "*", @@ -1594,9 +1498,27 @@ "chalk": "^4.0.0" }, "engines": { - "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jest/types/node_modules/@jest/schemas": { + "version": "29.6.0", + "resolved": "https://registry.npmmirror.com/@jest/schemas/-/schemas-29.6.0.tgz", + "integrity": "sha512-rxLjXyJBTL4LQeJW3aKo0M/+GkCOXsO+8i9Iu7eDb6KwtP65ayoDsitrdPBtujxQ88k4wI2FNYfa6TOGwSn6cQ==", + "dev": true, + "dependencies": { + "@sinclair/typebox": "^0.27.8" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, + "node_modules/@jest/types/node_modules/@sinclair/typebox": { + "version": "0.27.8", + "resolved": "https://registry.npmmirror.com/@sinclair/typebox/-/typebox-0.27.8.tgz", + "integrity": "sha512-+Fj43pSMwJs4KRrH/938Uf+uAELIgVBmQzg/q1YG10djyfA3TnrU8N8XzqCh/okZdszqBQTZf96idMfE5lnwTA==", + "dev": true + }, "node_modules/@jridgewell/gen-mapping": { "version": "0.1.1", "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.1.1.tgz", @@ -1611,9 +1533,9 @@ } }, "node_modules/@jridgewell/resolve-uri": { - "version": "3.0.7", - "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.0.7.tgz", - "integrity": "sha512-8cXDaBBHOr2pQ7j77Y6Vp5VDT2sIqWyWQ56TjEq4ih/a4iST3dItRe8Q9fp0rrIl9DoKhWQtUQz/YpOxLkXbNA==", + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.1.tgz", + "integrity": "sha512-dSYZh7HhCDtCKm4QakX0xFpsRDqjjtZf/kjI/v3T3Nwt5r8/qz/M19F9ySyOqU94SXBmeG9ttTul+YnR4LOxFA==", "dev": true, "engines": { "node": ">=6.0.0" @@ -1629,19 +1551,19 @@ } }, "node_modules/@jridgewell/sourcemap-codec": { - "version": "1.4.13", - "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.13.tgz", - "integrity": "sha512-GryiOJmNcWbovBxTfZSF71V/mXbgcV3MewDe3kIMCLyIh5e7SKAeUZs+rMnJ8jkMolZ/4/VsdBmMrw3l+VdZ3w==", + "version": "1.4.15", + "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.15.tgz", + "integrity": "sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg==", "dev": true }, "node_modules/@jridgewell/trace-mapping": { - "version": "0.3.15", - "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.15.tgz", - "integrity": "sha512-oWZNOULl+UbhsgB51uuZzglikfIKSUBO/M9W2OfEjn7cmqoAiCgmv9lyACTUacZwBz0ITnJ2NqjU8Tx0DHL88g==", + "version": "0.3.20", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.20.tgz", + "integrity": "sha512-R8LcPeWZol2zR8mmH3JeKQ6QRCFb7XgUhV9ZlGhHLGyg4wpPiPZNQOOWhFZhxKw8u//yTbNGI42Bx/3paXEQ+Q==", "dev": true, "dependencies": { - "@jridgewell/resolve-uri": "^3.0.3", - "@jridgewell/sourcemap-codec": "^1.4.10" + "@jridgewell/resolve-uri": "^3.1.0", + "@jridgewell/sourcemap-codec": "^1.4.14" } }, "node_modules/@nodelib/fs.scandir": { @@ -1693,6 +1615,30 @@ "node": ">= 6" } }, + "node_modules/@postman/tough-cookie": { + "version": "4.1.3-postman.1", + "resolved": "https://registry.npmjs.org/@postman/tough-cookie/-/tough-cookie-4.1.3-postman.1.tgz", + "integrity": "sha512-txpgUqZOnWYnUHZpHjkfb0IwVH4qJmyq77pPnJLlfhMtdCLMFTEeQHlzQiK906aaNCe4NEB5fGJHo9uzGbFMeA==", + "dev": true, + "dependencies": { + "psl": "^1.1.33", + "punycode": "^2.1.1", + "universalify": "^0.2.0", + "url-parse": "^1.5.3" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/@postman/tough-cookie/node_modules/universalify": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.2.0.tgz", + "integrity": "sha512-CJ1QgKmNg3CwvAv/kOFmtnEN05f0D/cn9QntgNOQlQF9dgvVTHj3t+8JPdjqawCHk7V/KA+fbUqzZ9XWhcqPUg==", + "dev": true, + "engines": { + "node": ">= 4.0.0" + } + }, "node_modules/@postman/tunnel-agent": { "version": "0.6.3", "resolved": "https://registry.npmjs.org/@postman/tunnel-agent/-/tunnel-agent-0.6.3.tgz", @@ -1866,9 +1812,9 @@ } }, "node_modules/@types/jest": { - "version": "29.0.0", - "resolved": "https://registry.npmjs.org/@types/jest/-/jest-29.0.0.tgz", - "integrity": "sha512-X6Zjz3WO4cT39Gkl0lZ2baFRaEMqJl5NC1OjElkwtNzAlbkr2K/WJXkBkH5VP0zx4Hgsd2TZYdOEfvp2Dxia+Q==", + "version": "29.5.3", + "resolved": "https://registry.npmmirror.com/@types/jest/-/jest-29.5.3.tgz", + "integrity": "sha512-1Nq7YrO/vJE/FYnqYyw0FS8LdrjExSgIiHyKg7xPpn+yi8Q4huZryKnkJatN1ZRH89Kw2v33/8ZMB7DuZeSLlA==", "dev": true, "dependencies": { "expect": "^29.0.0", @@ -1987,21 +1933,6 @@ } } }, - "node_modules/@typescript-eslint/eslint-plugin/node_modules/semver": { - "version": "7.3.7", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.7.tgz", - "integrity": "sha512-QlYTucUYOews+WeEujDoEGziz4K6c47V/Bd+LjSSYcA94p+DmINdf7ncaUinThfvZyu13lN9OY1XDxt8C0Tw0g==", - "dev": true, - "dependencies": { - "lru-cache": "^6.0.0" - }, - "bin": { - "semver": "bin/semver.js" - }, - "engines": { - "node": ">=10" - } - }, "node_modules/@typescript-eslint/parser": { "version": "5.36.2", "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-5.36.2.tgz", @@ -2113,21 +2044,6 @@ } } }, - "node_modules/@typescript-eslint/typescript-estree/node_modules/semver": { - "version": "7.3.7", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.7.tgz", - "integrity": "sha512-QlYTucUYOews+WeEujDoEGziz4K6c47V/Bd+LjSSYcA94p+DmINdf7ncaUinThfvZyu13lN9OY1XDxt8C0Tw0g==", - "dev": true, - "dependencies": { - "lru-cache": "^6.0.0" - }, - "bin": { - "semver": "bin/semver.js" - }, - "engines": { - "node": ">=10" - } - }, "node_modules/@typescript-eslint/utils": { "version": "5.36.2", "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-5.36.2.tgz", @@ -2364,9 +2280,9 @@ } }, "node_modules/async": { - "version": "3.2.3", - "resolved": "https://registry.npmjs.org/async/-/async-3.2.3.tgz", - "integrity": "sha512-spZRyzKL5l5BZQrr/6m/SqFdBN0q3OCI0f9rjfBzCMBIP4p75P620rR3gTmaksNOhmzgdxcaxdNfMy6anrbM0g==", + "version": "3.2.4", + "resolved": "https://registry.npmjs.org/async/-/async-3.2.4.tgz", + "integrity": "sha512-iAB+JbDEGXhyIUavoDl9WP/Jj106Kz9DEn1DPgYw5ruDn0e3Wgi3sKFm55sASdGBNOQB8F59d9qQ7deqrHA8wQ==", "dev": true }, "node_modules/asynckit": { @@ -2394,9 +2310,9 @@ } }, "node_modules/aws4": { - "version": "1.11.0", - "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.11.0.tgz", - "integrity": "sha512-xh1Rl34h6Fi1DC2WWKfxUTVqRsNnr6LsKz2+hfwDxQJWmrx8+c7ylaqBMcHfl1U1r2dsifOvKX3LQuLNZ+XSvA==", + "version": "1.12.0", + "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.12.0.tgz", + "integrity": "sha512-NmWvPnx0F1SfrQbYwOi7OeaNGokp9XhzNioJ/CSBs8Qa4vxug81mhJEAVZwxXuBmYB5KDRfMq/F3RR0BIU7sWg==", "dev": true }, "node_modules/babel-plugin-istanbul": { @@ -2585,9 +2501,9 @@ } }, "node_modules/brotli": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/brotli/-/brotli-1.3.2.tgz", - "integrity": "sha512-K0HNa0RRpUpcF8yS4yNSd6vmkrvA+wRd+symIcwhfqGLAi7YgGlKfO4oDYVgiahiLGNviO9uY7Zlb1MCPeTmSA==", + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/brotli/-/brotli-1.3.3.tgz", + "integrity": "sha512-oTKjJdShmDuGW94SyyaoQvAjf30dZaHnjJ8uAF+u2/vGJkJbJPJAT1gDiOJP5v1Zb6f9KEyW/1HpuaWIXtGHPg==", "dev": true, "dependencies": { "base64-js": "^1.1.2" @@ -2759,9 +2675,9 @@ } }, "node_modules/chardet": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/chardet/-/chardet-1.4.0.tgz", - "integrity": "sha512-NpwMDdSIprbYx1CLnfbxEIarI0Z+s9MssEgggMNheGM+WD68yOhV7IEA/3r6tr0yTRgQD0HuZJDw32s99i6L+A==", + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/chardet/-/chardet-1.6.0.tgz", + "integrity": "sha512-+QOTw3otC4+FxdjK9RopGpNOglADbr4WPFi0SonkO99JbpkTPbMxmdm4NenhF5Zs+4gPXLI1+y2uazws5TMe8w==", "dev": true }, "node_modules/charset": { @@ -2792,21 +2708,21 @@ "dev": true }, "node_modules/cli-progress": { - "version": "3.10.0", - "resolved": "https://registry.npmjs.org/cli-progress/-/cli-progress-3.10.0.tgz", - "integrity": "sha512-kLORQrhYCAtUPLZxqsAt2YJGOvRdt34+O6jl5cQGb7iF3dM55FQZlTR+rQyIK9JUcO9bBMwZsTlND+3dmFU2Cw==", + "version": "3.12.0", + "resolved": "https://registry.npmjs.org/cli-progress/-/cli-progress-3.12.0.tgz", + "integrity": "sha512-tRkV3HJ1ASwm19THiiLIXLO7Im7wlTuKnvkYaTkyoAPefqjNg7W7DHKUlGRxy9vxDvbyCYQkQozvptuMkGCg8A==", "dev": true, "dependencies": { - "string-width": "^4.2.0" + "string-width": "^4.2.3" }, "engines": { "node": ">=4" } }, "node_modules/cli-table3": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/cli-table3/-/cli-table3-0.6.1.tgz", - "integrity": "sha512-w0q/enDHhPLq44ovMGdQeeDLvwxwavsJX7oQGYt/LrBlYsyaxyDnp6z3QzFut/6kLLKnlcUVJLrpB7KBfgG/RA==", + "version": "0.6.3", + "resolved": "https://registry.npmjs.org/cli-table3/-/cli-table3-0.6.3.tgz", + "integrity": "sha512-w5Jac5SykAeZJKntOxJCrm63Eg5/4dhMWIcuTbo9rpE+brgaSZo0RuNJZeOyMgsUdhDeojvgyQLmjI+K50ZGyg==", "dev": true, "dependencies": { "string-width": "^4.2.0" @@ -2815,7 +2731,7 @@ "node": "10.* || >= 12.*" }, "optionalDependencies": { - "colors": "1.4.0" + "@colors/colors": "1.5.0" } }, "node_modules/cliui": { @@ -2894,12 +2810,12 @@ } }, "node_modules/commander": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/commander/-/commander-7.2.0.tgz", - "integrity": "sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw==", + "version": "11.0.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-11.0.0.tgz", + "integrity": "sha512-9HMlXtt/BNoYr8ooyjjNRdIilOTkVJXB+GhxMTtOKwk0R4j4lS4NpjuqmRxroBfnfTSHQIHQB7wryHhXarNjmQ==", "dev": true, "engines": { - "node": ">= 10" + "node": ">=16" } }, "node_modules/concat-map": { @@ -2980,10 +2896,22 @@ "integrity": "sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==", "dev": true }, - "node_modules/create-require": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/create-require/-/create-require-1.1.1.tgz", - "integrity": "sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ==", + "node_modules/cors": { + "version": "2.8.5", + "resolved": "https://registry.npmjs.org/cors/-/cors-2.8.5.tgz", + "integrity": "sha512-KIHbLJqu73RGr/hnbrO9uBeixNGuvSQjul/jdFvS/KFSIH1hWVd1ng7zOHx+YrEfInLG7q4n6GHQ9cDtxv/P6g==", + "dependencies": { + "object-assign": "^4", + "vary": "^1" + }, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/create-require": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/create-require/-/create-require-1.1.1.tgz", + "integrity": "sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ==", "dev": true }, "node_modules/cross-spawn": { @@ -3099,6 +3027,16 @@ "node": ">= 0.8" } }, + "node_modules/des.js": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/des.js/-/des.js-1.1.0.tgz", + "integrity": "sha512-r17GxjhUCjSRy8aiJpr8/UadFIzMzJGexI3Nmz4ADi9LYSFx4gTBp80+NaX/YsXWWLhpZ7v/v/ubEc/bCNfKwg==", + "dev": true, + "dependencies": { + "inherits": "^2.0.1", + "minimalistic-assert": "^1.0.0" + } + }, "node_modules/destroy": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.2.0.tgz", @@ -3572,12 +3510,6 @@ "node": ">= 0.6" } }, - "node_modules/eventemitter3": { - "version": "4.0.7", - "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-4.0.7.tgz", - "integrity": "sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw==", - "dev": true - }, "node_modules/execa": { "version": "5.1.1", "resolved": "https://registry.npmjs.org/execa/-/execa-5.1.1.tgz", @@ -3635,52 +3567,6 @@ "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, - "node_modules/expect/node_modules/@jest/schemas": { - "version": "29.0.0", - "resolved": "https://registry.npmjs.org/@jest/schemas/-/schemas-29.0.0.tgz", - "integrity": "sha512-3Ab5HgYIIAnS0HjqJHQYZS+zXc4tUmTmBH3z83ajI6afXp8X3ZtdLX+nXx+I7LNkJD7uN9LAVhgnjDgZa2z0kA==", - "dev": true, - "dependencies": { - "@sinclair/typebox": "^0.24.1" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/expect/node_modules/@jest/types": { - "version": "29.0.2", - "resolved": "https://registry.npmjs.org/@jest/types/-/types-29.0.2.tgz", - "integrity": "sha512-5WNMesBLmlkt1+fVkoCjHa0X3i3q8zc4QLTDkdHgCa2gyPZc7rdlZBWgVLqwS1860ZW5xJuCDwAzqbGaXIr/ew==", - "dev": true, - "dependencies": { - "@jest/schemas": "^29.0.0", - "@types/istanbul-lib-coverage": "^2.0.0", - "@types/istanbul-reports": "^3.0.0", - "@types/node": "*", - "@types/yargs": "^17.0.8", - "chalk": "^4.0.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/expect/node_modules/jest-util": { - "version": "29.0.2", - "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-29.0.2.tgz", - "integrity": "sha512-ozk8ruEEEACxqpz0hN9UOgtPZS0aN+NffwQduR5dVlhN+eN47vxurtvgZkYZYMpYrsmlAEx1XabkB3BnN0GfKQ==", - "dev": true, - "dependencies": { - "@jest/types": "^29.0.2", - "@types/node": "*", - "chalk": "^4.0.0", - "ci-info": "^3.2.0", - "graceful-fs": "^4.2.9", - "picomatch": "^2.2.3" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, "node_modules/express": { "version": "4.18.1", "resolved": "https://registry.npmjs.org/express/-/express-4.18.1.tgz", @@ -3780,12 +3666,6 @@ "node >=0.6.0" ] }, - "node_modules/faker": { - "version": "5.5.3", - "resolved": "https://registry.npmjs.org/faker/-/faker-5.5.3.tgz", - "integrity": "sha512-wLTv2a28wjUyWkbnX7u/ABZBkUkIF2fCd73V6P2oFqEGEktDfzWx4UxrSqtPRw0xPRAcjeAOIiJWqZm3pP4u3g==", - "dev": true - }, "node_modules/fast-deep-equal": { "version": "3.1.3", "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", @@ -3872,12 +3752,12 @@ } }, "node_modules/filesize": { - "version": "8.0.7", - "resolved": "https://registry.npmjs.org/filesize/-/filesize-8.0.7.tgz", - "integrity": "sha512-pjmC+bkIF8XI7fWaH8KxHcZL3DPybs1roSKP4rKDvy20tAWwIObE4+JIseG2byfGKhud5ZnM4YSGKBz7Sh0ndQ==", + "version": "10.0.12", + "resolved": "https://registry.npmjs.org/filesize/-/filesize-10.0.12.tgz", + "integrity": "sha512-6RS9gDchbn+qWmtV2uSjo5vmKizgfCQeb5jKmqx8HyzA3MoLqqyQxN+QcjkGBJt7FjJ9qFce67Auyya5rRRbpw==", "dev": true, "engines": { - "node": ">= 0.4.0" + "node": ">= 10.4.0" } }, "node_modules/fill-range": { @@ -3960,9 +3840,9 @@ } }, "node_modules/flatted": { - "version": "3.2.5", - "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.2.5.tgz", - "integrity": "sha512-WIWGi2L3DyTUvUrwRKgGi9TwxQMUEqPOPQBVi71R96jZXJdFskXEmf54BoZaS1kknGODoIGASGEzBUYdyMCBJg==", + "version": "3.2.6", + "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.2.6.tgz", + "integrity": "sha512-0sQoMh9s0BYsm+12Huy/rkKxVu4R1+r96YX5cG44rHV0pQ6iC3Q+mkoMFaGWObMFYQxCVT+ssG1ksneA2MI9KQ==", "dev": true }, "node_modules/forever-agent": { @@ -4262,13 +4142,13 @@ "dev": true }, "node_modules/handlebars": { - "version": "4.7.7", - "resolved": "https://registry.npmjs.org/handlebars/-/handlebars-4.7.7.tgz", - "integrity": "sha512-aAcXm5OAfE/8IXkcZvCepKU3VzW1/39Fb5ZuqMtgI/hT8X2YgoMvBY5dLhq/cpOvw7Lk1nK/UF71aLG/ZnVYRA==", + "version": "4.7.8", + "resolved": "https://registry.npmjs.org/handlebars/-/handlebars-4.7.8.tgz", + "integrity": "sha512-vafaFqs8MZkRrSX7sFVUdo3ap/eNiLnb4IakshzvP56X5Nr1iGKAIqdX6tMlm6HcNRIkr6AxO5jFEoJzzpT8aQ==", "dev": true, "dependencies": { "minimist": "^1.2.5", - "neo-async": "^2.6.0", + "neo-async": "^2.6.2", "source-map": "^0.6.1", "wordwrap": "^1.0.0" }, @@ -4384,22 +4264,34 @@ } }, "node_modules/httpntlm": { - "version": "1.7.7", - "resolved": "https://registry.npmjs.org/httpntlm/-/httpntlm-1.7.7.tgz", - "integrity": "sha512-Pv2Rvrz8H0qv1Dne5mAdZ9JegG1uc6Vu5lwLflIY6s8RKHdZQbW39L4dYswSgqMDT0pkJILUTKjeyU0VPNRZjA==", + "version": "1.8.13", + "resolved": "https://registry.npmjs.org/httpntlm/-/httpntlm-1.8.13.tgz", + "integrity": "sha512-2F2FDPiWT4rewPzNMg3uPhNkP3NExENlUGADRUDPQvuftuUTGW98nLZtGemCIW3G40VhWZYgkIDcQFAwZ3mf2Q==", "dev": true, + "funding": [ + { + "type": "paypal", + "url": "https://www.paypal.com/donate/?hosted_button_id=2CKNJLZJBW8ZC" + }, + { + "type": "buymeacoffee", + "url": "https://www.buymeacoffee.com/samdecrock" + } + ], "dependencies": { + "des.js": "^1.0.1", "httpreq": ">=0.4.22", + "js-md4": "^0.3.2", "underscore": "~1.12.1" }, "engines": { - "node": ">=0.8.0" + "node": ">=10.4.0" } }, "node_modules/httpreq": { - "version": "0.5.2", - "resolved": "https://registry.npmjs.org/httpreq/-/httpreq-0.5.2.tgz", - "integrity": "sha512-2Jm+x9WkExDOeFRrdBCBSpLPT5SokTcRHkunV3pjKmX/cx6av8zQ0WtHUMDrYb6O4hBFzNU6sxJEypvRUVYKnw==", + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/httpreq/-/httpreq-1.1.1.tgz", + "integrity": "sha512-uhSZLPPD2VXXOSN8Cni3kIsoFHaU2pT/nySEU/fHr/ePbqHYr0jeiQRmUKLEirC09SFPsdMoA7LU7UXMd/w0Kw==", "dev": true, "engines": { "node": ">= 6.15.1" @@ -4548,15 +4440,6 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/ip-regex": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/ip-regex/-/ip-regex-2.1.0.tgz", - "integrity": "sha1-+ni/XS5pE8kRzp+BnuUUa7bYROk=", - "dev": true, - "engines": { - "node": ">=4" - } - }, "node_modules/ipaddr.js": { "version": "1.9.1", "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz", @@ -4826,52 +4709,6 @@ "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, - "node_modules/jest-circus/node_modules/@jest/schemas": { - "version": "29.0.0", - "resolved": "https://registry.npmjs.org/@jest/schemas/-/schemas-29.0.0.tgz", - "integrity": "sha512-3Ab5HgYIIAnS0HjqJHQYZS+zXc4tUmTmBH3z83ajI6afXp8X3ZtdLX+nXx+I7LNkJD7uN9LAVhgnjDgZa2z0kA==", - "dev": true, - "dependencies": { - "@sinclair/typebox": "^0.24.1" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/jest-circus/node_modules/@jest/types": { - "version": "29.0.2", - "resolved": "https://registry.npmjs.org/@jest/types/-/types-29.0.2.tgz", - "integrity": "sha512-5WNMesBLmlkt1+fVkoCjHa0X3i3q8zc4QLTDkdHgCa2gyPZc7rdlZBWgVLqwS1860ZW5xJuCDwAzqbGaXIr/ew==", - "dev": true, - "dependencies": { - "@jest/schemas": "^29.0.0", - "@types/istanbul-lib-coverage": "^2.0.0", - "@types/istanbul-reports": "^3.0.0", - "@types/node": "*", - "@types/yargs": "^17.0.8", - "chalk": "^4.0.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/jest-circus/node_modules/jest-util": { - "version": "29.0.2", - "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-29.0.2.tgz", - "integrity": "sha512-ozk8ruEEEACxqpz0hN9UOgtPZS0aN+NffwQduR5dVlhN+eN47vxurtvgZkYZYMpYrsmlAEx1XabkB3BnN0GfKQ==", - "dev": true, - "dependencies": { - "@jest/types": "^29.0.2", - "@types/node": "*", - "chalk": "^4.0.0", - "ci-info": "^3.2.0", - "graceful-fs": "^4.2.9", - "picomatch": "^2.2.3" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, "node_modules/jest-circus/node_modules/p-limit": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", @@ -4921,52 +4758,6 @@ } } }, - "node_modules/jest-cli/node_modules/@jest/schemas": { - "version": "29.0.0", - "resolved": "https://registry.npmjs.org/@jest/schemas/-/schemas-29.0.0.tgz", - "integrity": "sha512-3Ab5HgYIIAnS0HjqJHQYZS+zXc4tUmTmBH3z83ajI6afXp8X3ZtdLX+nXx+I7LNkJD7uN9LAVhgnjDgZa2z0kA==", - "dev": true, - "dependencies": { - "@sinclair/typebox": "^0.24.1" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/jest-cli/node_modules/@jest/types": { - "version": "29.0.2", - "resolved": "https://registry.npmjs.org/@jest/types/-/types-29.0.2.tgz", - "integrity": "sha512-5WNMesBLmlkt1+fVkoCjHa0X3i3q8zc4QLTDkdHgCa2gyPZc7rdlZBWgVLqwS1860ZW5xJuCDwAzqbGaXIr/ew==", - "dev": true, - "dependencies": { - "@jest/schemas": "^29.0.0", - "@types/istanbul-lib-coverage": "^2.0.0", - "@types/istanbul-reports": "^3.0.0", - "@types/node": "*", - "@types/yargs": "^17.0.8", - "chalk": "^4.0.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/jest-cli/node_modules/jest-util": { - "version": "29.0.2", - "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-29.0.2.tgz", - "integrity": "sha512-ozk8ruEEEACxqpz0hN9UOgtPZS0aN+NffwQduR5dVlhN+eN47vxurtvgZkYZYMpYrsmlAEx1XabkB3BnN0GfKQ==", - "dev": true, - "dependencies": { - "@jest/types": "^29.0.2", - "@types/node": "*", - "chalk": "^4.0.0", - "ci-info": "^3.2.0", - "graceful-fs": "^4.2.9", - "picomatch": "^2.2.3" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, "node_modules/jest-config": { "version": "29.0.2", "resolved": "https://registry.npmjs.org/jest-config/-/jest-config-29.0.2.tgz", @@ -5012,18 +4803,6 @@ } } }, - "node_modules/jest-config/node_modules/@jest/schemas": { - "version": "29.0.0", - "resolved": "https://registry.npmjs.org/@jest/schemas/-/schemas-29.0.0.tgz", - "integrity": "sha512-3Ab5HgYIIAnS0HjqJHQYZS+zXc4tUmTmBH3z83ajI6afXp8X3ZtdLX+nXx+I7LNkJD7uN9LAVhgnjDgZa2z0kA==", - "dev": true, - "dependencies": { - "@sinclair/typebox": "^0.24.1" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, "node_modules/jest-config/node_modules/@jest/transform": { "version": "29.0.2", "resolved": "https://registry.npmjs.org/@jest/transform/-/transform-29.0.2.tgz", @@ -5050,23 +4829,6 @@ "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, - "node_modules/jest-config/node_modules/@jest/types": { - "version": "29.0.2", - "resolved": "https://registry.npmjs.org/@jest/types/-/types-29.0.2.tgz", - "integrity": "sha512-5WNMesBLmlkt1+fVkoCjHa0X3i3q8zc4QLTDkdHgCa2gyPZc7rdlZBWgVLqwS1860ZW5xJuCDwAzqbGaXIr/ew==", - "dev": true, - "dependencies": { - "@jest/schemas": "^29.0.0", - "@types/istanbul-lib-coverage": "^2.0.0", - "@types/istanbul-reports": "^3.0.0", - "@types/node": "*", - "@types/yargs": "^17.0.8", - "chalk": "^4.0.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, "node_modules/jest-config/node_modules/babel-jest": { "version": "29.0.2", "resolved": "https://registry.npmjs.org/babel-jest/-/babel-jest-29.0.2.tgz", @@ -5153,23 +4915,6 @@ "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, - "node_modules/jest-config/node_modules/jest-util": { - "version": "29.0.2", - "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-29.0.2.tgz", - "integrity": "sha512-ozk8ruEEEACxqpz0hN9UOgtPZS0aN+NffwQduR5dVlhN+eN47vxurtvgZkYZYMpYrsmlAEx1XabkB3BnN0GfKQ==", - "dev": true, - "dependencies": { - "@jest/types": "^29.0.2", - "@types/node": "*", - "chalk": "^4.0.0", - "ci-info": "^3.2.0", - "graceful-fs": "^4.2.9", - "picomatch": "^2.2.3" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, "node_modules/jest-config/node_modules/jest-worker": { "version": "29.0.2", "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-29.0.2.tgz", @@ -5242,52 +4987,6 @@ "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, - "node_modules/jest-each/node_modules/@jest/schemas": { - "version": "29.0.0", - "resolved": "https://registry.npmjs.org/@jest/schemas/-/schemas-29.0.0.tgz", - "integrity": "sha512-3Ab5HgYIIAnS0HjqJHQYZS+zXc4tUmTmBH3z83ajI6afXp8X3ZtdLX+nXx+I7LNkJD7uN9LAVhgnjDgZa2z0kA==", - "dev": true, - "dependencies": { - "@sinclair/typebox": "^0.24.1" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/jest-each/node_modules/@jest/types": { - "version": "29.0.2", - "resolved": "https://registry.npmjs.org/@jest/types/-/types-29.0.2.tgz", - "integrity": "sha512-5WNMesBLmlkt1+fVkoCjHa0X3i3q8zc4QLTDkdHgCa2gyPZc7rdlZBWgVLqwS1860ZW5xJuCDwAzqbGaXIr/ew==", - "dev": true, - "dependencies": { - "@jest/schemas": "^29.0.0", - "@types/istanbul-lib-coverage": "^2.0.0", - "@types/istanbul-reports": "^3.0.0", - "@types/node": "*", - "@types/yargs": "^17.0.8", - "chalk": "^4.0.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/jest-each/node_modules/jest-util": { - "version": "29.0.2", - "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-29.0.2.tgz", - "integrity": "sha512-ozk8ruEEEACxqpz0hN9UOgtPZS0aN+NffwQduR5dVlhN+eN47vxurtvgZkYZYMpYrsmlAEx1XabkB3BnN0GfKQ==", - "dev": true, - "dependencies": { - "@jest/types": "^29.0.2", - "@types/node": "*", - "chalk": "^4.0.0", - "ci-info": "^3.2.0", - "graceful-fs": "^4.2.9", - "picomatch": "^2.2.3" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, "node_modules/jest-environment-node": { "version": "29.0.2", "resolved": "https://registry.npmjs.org/jest-environment-node/-/jest-environment-node-29.0.2.tgz", @@ -5305,78 +5004,32 @@ "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, - "node_modules/jest-environment-node/node_modules/@jest/schemas": { + "node_modules/jest-get-type": { "version": "29.0.0", - "resolved": "https://registry.npmjs.org/@jest/schemas/-/schemas-29.0.0.tgz", - "integrity": "sha512-3Ab5HgYIIAnS0HjqJHQYZS+zXc4tUmTmBH3z83ajI6afXp8X3ZtdLX+nXx+I7LNkJD7uN9LAVhgnjDgZa2z0kA==", + "resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-29.0.0.tgz", + "integrity": "sha512-83X19z/HuLKYXYHskZlBAShO7UfLFXu/vWajw9ZNJASN32li8yHMaVGAQqxFW1RCFOkB7cubaL6FaJVQqqJLSw==", "dev": true, - "dependencies": { - "@sinclair/typebox": "^0.24.1" - }, "engines": { "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, - "node_modules/jest-environment-node/node_modules/@jest/types": { + "node_modules/jest-leak-detector": { "version": "29.0.2", - "resolved": "https://registry.npmjs.org/@jest/types/-/types-29.0.2.tgz", - "integrity": "sha512-5WNMesBLmlkt1+fVkoCjHa0X3i3q8zc4QLTDkdHgCa2gyPZc7rdlZBWgVLqwS1860ZW5xJuCDwAzqbGaXIr/ew==", + "resolved": "https://registry.npmjs.org/jest-leak-detector/-/jest-leak-detector-29.0.2.tgz", + "integrity": "sha512-5f0493qDeAxjUldkBSQg5D1cLadRgZVyWpTQvfJeQwQUpHQInE21AyVHVv64M7P2Ue8Z5EZ4BAcoDS/dSPPgMw==", "dev": true, "dependencies": { - "@jest/schemas": "^29.0.0", - "@types/istanbul-lib-coverage": "^2.0.0", - "@types/istanbul-reports": "^3.0.0", - "@types/node": "*", - "@types/yargs": "^17.0.8", - "chalk": "^4.0.0" + "jest-get-type": "^29.0.0", + "pretty-format": "^29.0.2" }, "engines": { "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, - "node_modules/jest-environment-node/node_modules/jest-util": { + "node_modules/jest-matcher-utils": { "version": "29.0.2", - "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-29.0.2.tgz", - "integrity": "sha512-ozk8ruEEEACxqpz0hN9UOgtPZS0aN+NffwQduR5dVlhN+eN47vxurtvgZkYZYMpYrsmlAEx1XabkB3BnN0GfKQ==", - "dev": true, - "dependencies": { - "@jest/types": "^29.0.2", - "@types/node": "*", - "chalk": "^4.0.0", - "ci-info": "^3.2.0", - "graceful-fs": "^4.2.9", - "picomatch": "^2.2.3" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/jest-get-type": { - "version": "29.0.0", - "resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-29.0.0.tgz", - "integrity": "sha512-83X19z/HuLKYXYHskZlBAShO7UfLFXu/vWajw9ZNJASN32li8yHMaVGAQqxFW1RCFOkB7cubaL6FaJVQqqJLSw==", - "dev": true, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/jest-leak-detector": { - "version": "29.0.2", - "resolved": "https://registry.npmjs.org/jest-leak-detector/-/jest-leak-detector-29.0.2.tgz", - "integrity": "sha512-5f0493qDeAxjUldkBSQg5D1cLadRgZVyWpTQvfJeQwQUpHQInE21AyVHVv64M7P2Ue8Z5EZ4BAcoDS/dSPPgMw==", - "dev": true, - "dependencies": { - "jest-get-type": "^29.0.0", - "pretty-format": "^29.0.2" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/jest-matcher-utils": { - "version": "29.0.2", - "resolved": "https://registry.npmjs.org/jest-matcher-utils/-/jest-matcher-utils-29.0.2.tgz", - "integrity": "sha512-s62YkHFBfAx0JLA2QX1BlnCRFwHRobwAv2KP1+YhjzF6ZCbCVrf1sG8UJyn62ZUsDaQKpoo86XMTjkUyO5aWmQ==", + "resolved": "https://registry.npmjs.org/jest-matcher-utils/-/jest-matcher-utils-29.0.2.tgz", + "integrity": "sha512-s62YkHFBfAx0JLA2QX1BlnCRFwHRobwAv2KP1+YhjzF6ZCbCVrf1sG8UJyn62ZUsDaQKpoo86XMTjkUyO5aWmQ==", "dev": true, "dependencies": { "chalk": "^4.0.0", @@ -5408,35 +5061,6 @@ "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, - "node_modules/jest-message-util/node_modules/@jest/schemas": { - "version": "29.0.0", - "resolved": "https://registry.npmjs.org/@jest/schemas/-/schemas-29.0.0.tgz", - "integrity": "sha512-3Ab5HgYIIAnS0HjqJHQYZS+zXc4tUmTmBH3z83ajI6afXp8X3ZtdLX+nXx+I7LNkJD7uN9LAVhgnjDgZa2z0kA==", - "dev": true, - "dependencies": { - "@sinclair/typebox": "^0.24.1" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/jest-message-util/node_modules/@jest/types": { - "version": "29.0.2", - "resolved": "https://registry.npmjs.org/@jest/types/-/types-29.0.2.tgz", - "integrity": "sha512-5WNMesBLmlkt1+fVkoCjHa0X3i3q8zc4QLTDkdHgCa2gyPZc7rdlZBWgVLqwS1860ZW5xJuCDwAzqbGaXIr/ew==", - "dev": true, - "dependencies": { - "@jest/schemas": "^29.0.0", - "@types/istanbul-lib-coverage": "^2.0.0", - "@types/istanbul-reports": "^3.0.0", - "@types/node": "*", - "@types/yargs": "^17.0.8", - "chalk": "^4.0.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, "node_modules/jest-mock": { "version": "29.0.2", "resolved": "https://registry.npmjs.org/jest-mock/-/jest-mock-29.0.2.tgz", @@ -5450,35 +5074,6 @@ "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, - "node_modules/jest-mock/node_modules/@jest/schemas": { - "version": "29.0.0", - "resolved": "https://registry.npmjs.org/@jest/schemas/-/schemas-29.0.0.tgz", - "integrity": "sha512-3Ab5HgYIIAnS0HjqJHQYZS+zXc4tUmTmBH3z83ajI6afXp8X3ZtdLX+nXx+I7LNkJD7uN9LAVhgnjDgZa2z0kA==", - "dev": true, - "dependencies": { - "@sinclair/typebox": "^0.24.1" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/jest-mock/node_modules/@jest/types": { - "version": "29.0.2", - "resolved": "https://registry.npmjs.org/@jest/types/-/types-29.0.2.tgz", - "integrity": "sha512-5WNMesBLmlkt1+fVkoCjHa0X3i3q8zc4QLTDkdHgCa2gyPZc7rdlZBWgVLqwS1860ZW5xJuCDwAzqbGaXIr/ew==", - "dev": true, - "dependencies": { - "@jest/schemas": "^29.0.0", - "@types/istanbul-lib-coverage": "^2.0.0", - "@types/istanbul-reports": "^3.0.0", - "@types/node": "*", - "@types/yargs": "^17.0.8", - "chalk": "^4.0.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, "node_modules/jest-pnp-resolver": { "version": "1.2.2", "resolved": "https://registry.npmjs.org/jest-pnp-resolver/-/jest-pnp-resolver-1.2.2.tgz", @@ -5538,35 +5133,6 @@ "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, - "node_modules/jest-resolve/node_modules/@jest/schemas": { - "version": "29.0.0", - "resolved": "https://registry.npmjs.org/@jest/schemas/-/schemas-29.0.0.tgz", - "integrity": "sha512-3Ab5HgYIIAnS0HjqJHQYZS+zXc4tUmTmBH3z83ajI6afXp8X3ZtdLX+nXx+I7LNkJD7uN9LAVhgnjDgZa2z0kA==", - "dev": true, - "dependencies": { - "@sinclair/typebox": "^0.24.1" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/jest-resolve/node_modules/@jest/types": { - "version": "29.0.2", - "resolved": "https://registry.npmjs.org/@jest/types/-/types-29.0.2.tgz", - "integrity": "sha512-5WNMesBLmlkt1+fVkoCjHa0X3i3q8zc4QLTDkdHgCa2gyPZc7rdlZBWgVLqwS1860ZW5xJuCDwAzqbGaXIr/ew==", - "dev": true, - "dependencies": { - "@jest/schemas": "^29.0.0", - "@types/istanbul-lib-coverage": "^2.0.0", - "@types/istanbul-reports": "^3.0.0", - "@types/node": "*", - "@types/yargs": "^17.0.8", - "chalk": "^4.0.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, "node_modules/jest-resolve/node_modules/jest-haste-map": { "version": "29.0.2", "resolved": "https://registry.npmjs.org/jest-haste-map/-/jest-haste-map-29.0.2.tgz", @@ -5601,23 +5167,6 @@ "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, - "node_modules/jest-resolve/node_modules/jest-util": { - "version": "29.0.2", - "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-29.0.2.tgz", - "integrity": "sha512-ozk8ruEEEACxqpz0hN9UOgtPZS0aN+NffwQduR5dVlhN+eN47vxurtvgZkYZYMpYrsmlAEx1XabkB3BnN0GfKQ==", - "dev": true, - "dependencies": { - "@jest/types": "^29.0.2", - "@types/node": "*", - "chalk": "^4.0.0", - "ci-info": "^3.2.0", - "graceful-fs": "^4.2.9", - "picomatch": "^2.2.3" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, "node_modules/jest-resolve/node_modules/jest-worker": { "version": "29.0.2", "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-29.0.2.tgz", @@ -5679,18 +5228,6 @@ "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, - "node_modules/jest-runner/node_modules/@jest/schemas": { - "version": "29.0.0", - "resolved": "https://registry.npmjs.org/@jest/schemas/-/schemas-29.0.0.tgz", - "integrity": "sha512-3Ab5HgYIIAnS0HjqJHQYZS+zXc4tUmTmBH3z83ajI6afXp8X3ZtdLX+nXx+I7LNkJD7uN9LAVhgnjDgZa2z0kA==", - "dev": true, - "dependencies": { - "@sinclair/typebox": "^0.24.1" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, "node_modules/jest-runner/node_modules/@jest/transform": { "version": "29.0.2", "resolved": "https://registry.npmjs.org/@jest/transform/-/transform-29.0.2.tgz", @@ -5717,23 +5254,6 @@ "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, - "node_modules/jest-runner/node_modules/@jest/types": { - "version": "29.0.2", - "resolved": "https://registry.npmjs.org/@jest/types/-/types-29.0.2.tgz", - "integrity": "sha512-5WNMesBLmlkt1+fVkoCjHa0X3i3q8zc4QLTDkdHgCa2gyPZc7rdlZBWgVLqwS1860ZW5xJuCDwAzqbGaXIr/ew==", - "dev": true, - "dependencies": { - "@jest/schemas": "^29.0.0", - "@types/istanbul-lib-coverage": "^2.0.0", - "@types/istanbul-reports": "^3.0.0", - "@types/node": "*", - "@types/yargs": "^17.0.8", - "chalk": "^4.0.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, "node_modules/jest-runner/node_modules/jest-haste-map": { "version": "29.0.2", "resolved": "https://registry.npmjs.org/jest-haste-map/-/jest-haste-map-29.0.2.tgz", @@ -5768,23 +5288,6 @@ "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, - "node_modules/jest-runner/node_modules/jest-util": { - "version": "29.0.2", - "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-29.0.2.tgz", - "integrity": "sha512-ozk8ruEEEACxqpz0hN9UOgtPZS0aN+NffwQduR5dVlhN+eN47vxurtvgZkYZYMpYrsmlAEx1XabkB3BnN0GfKQ==", - "dev": true, - "dependencies": { - "@jest/types": "^29.0.2", - "@types/node": "*", - "chalk": "^4.0.0", - "ci-info": "^3.2.0", - "graceful-fs": "^4.2.9", - "picomatch": "^2.2.3" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, "node_modules/jest-runner/node_modules/jest-worker": { "version": "29.0.2", "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-29.0.2.tgz", @@ -5862,18 +5365,6 @@ "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, - "node_modules/jest-runtime/node_modules/@jest/schemas": { - "version": "29.0.0", - "resolved": "https://registry.npmjs.org/@jest/schemas/-/schemas-29.0.0.tgz", - "integrity": "sha512-3Ab5HgYIIAnS0HjqJHQYZS+zXc4tUmTmBH3z83ajI6afXp8X3ZtdLX+nXx+I7LNkJD7uN9LAVhgnjDgZa2z0kA==", - "dev": true, - "dependencies": { - "@sinclair/typebox": "^0.24.1" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, "node_modules/jest-runtime/node_modules/@jest/transform": { "version": "29.0.2", "resolved": "https://registry.npmjs.org/@jest/transform/-/transform-29.0.2.tgz", @@ -5900,23 +5391,6 @@ "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, - "node_modules/jest-runtime/node_modules/@jest/types": { - "version": "29.0.2", - "resolved": "https://registry.npmjs.org/@jest/types/-/types-29.0.2.tgz", - "integrity": "sha512-5WNMesBLmlkt1+fVkoCjHa0X3i3q8zc4QLTDkdHgCa2gyPZc7rdlZBWgVLqwS1860ZW5xJuCDwAzqbGaXIr/ew==", - "dev": true, - "dependencies": { - "@jest/schemas": "^29.0.0", - "@types/istanbul-lib-coverage": "^2.0.0", - "@types/istanbul-reports": "^3.0.0", - "@types/node": "*", - "@types/yargs": "^17.0.8", - "chalk": "^4.0.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, "node_modules/jest-runtime/node_modules/jest-haste-map": { "version": "29.0.2", "resolved": "https://registry.npmjs.org/jest-haste-map/-/jest-haste-map-29.0.2.tgz", @@ -5951,23 +5425,6 @@ "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, - "node_modules/jest-runtime/node_modules/jest-util": { - "version": "29.0.2", - "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-29.0.2.tgz", - "integrity": "sha512-ozk8ruEEEACxqpz0hN9UOgtPZS0aN+NffwQduR5dVlhN+eN47vxurtvgZkYZYMpYrsmlAEx1XabkB3BnN0GfKQ==", - "dev": true, - "dependencies": { - "@jest/types": "^29.0.2", - "@types/node": "*", - "chalk": "^4.0.0", - "ci-info": "^3.2.0", - "graceful-fs": "^4.2.9", - "picomatch": "^2.2.3" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, "node_modules/jest-runtime/node_modules/jest-worker": { "version": "29.0.2", "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-29.0.2.tgz", @@ -6032,18 +5489,6 @@ "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, - "node_modules/jest-snapshot/node_modules/@jest/schemas": { - "version": "29.0.0", - "resolved": "https://registry.npmjs.org/@jest/schemas/-/schemas-29.0.0.tgz", - "integrity": "sha512-3Ab5HgYIIAnS0HjqJHQYZS+zXc4tUmTmBH3z83ajI6afXp8X3ZtdLX+nXx+I7LNkJD7uN9LAVhgnjDgZa2z0kA==", - "dev": true, - "dependencies": { - "@sinclair/typebox": "^0.24.1" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, "node_modules/jest-snapshot/node_modules/@jest/transform": { "version": "29.0.2", "resolved": "https://registry.npmjs.org/@jest/transform/-/transform-29.0.2.tgz", @@ -6070,23 +5515,6 @@ "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, - "node_modules/jest-snapshot/node_modules/@jest/types": { - "version": "29.0.2", - "resolved": "https://registry.npmjs.org/@jest/types/-/types-29.0.2.tgz", - "integrity": "sha512-5WNMesBLmlkt1+fVkoCjHa0X3i3q8zc4QLTDkdHgCa2gyPZc7rdlZBWgVLqwS1860ZW5xJuCDwAzqbGaXIr/ew==", - "dev": true, - "dependencies": { - "@jest/schemas": "^29.0.0", - "@types/istanbul-lib-coverage": "^2.0.0", - "@types/istanbul-reports": "^3.0.0", - "@types/node": "*", - "@types/yargs": "^17.0.8", - "chalk": "^4.0.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, "node_modules/jest-snapshot/node_modules/jest-haste-map": { "version": "29.0.2", "resolved": "https://registry.npmjs.org/jest-haste-map/-/jest-haste-map-29.0.2.tgz", @@ -6121,23 +5549,6 @@ "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, - "node_modules/jest-snapshot/node_modules/jest-util": { - "version": "29.0.2", - "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-29.0.2.tgz", - "integrity": "sha512-ozk8ruEEEACxqpz0hN9UOgtPZS0aN+NffwQduR5dVlhN+eN47vxurtvgZkYZYMpYrsmlAEx1XabkB3BnN0GfKQ==", - "dev": true, - "dependencies": { - "@jest/types": "^29.0.2", - "@types/node": "*", - "chalk": "^4.0.0", - "ci-info": "^3.2.0", - "graceful-fs": "^4.2.9", - "picomatch": "^2.2.3" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, "node_modules/jest-snapshot/node_modules/jest-worker": { "version": "29.0.2", "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-29.0.2.tgz", @@ -6168,12 +5579,12 @@ } }, "node_modules/jest-util": { - "version": "28.1.1", - "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-28.1.1.tgz", - "integrity": "sha512-FktOu7ca1DZSyhPAxgxB6hfh2+9zMoJ7aEQA759Z6p45NuO8mWcqujH+UdHlCm/V6JTWwDztM2ITCzU1ijJAfw==", + "version": "29.6.2", + "resolved": "https://registry.npmmirror.com/jest-util/-/jest-util-29.6.2.tgz", + "integrity": "sha512-3eX1qb6L88lJNCFlEADKOkjpXJQyZRiavX1INZ4tRnrBVr2COd3RgcTLyUiEXMNBlDU/cgYq6taUS0fExrWW4w==", "dev": true, "dependencies": { - "@jest/types": "^28.1.1", + "@jest/types": "^29.6.1", "@types/node": "*", "chalk": "^4.0.0", "ci-info": "^3.2.0", @@ -6181,7 +5592,7 @@ "picomatch": "^2.2.3" }, "engines": { - "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, "node_modules/jest-validate": { @@ -6201,107 +5612,32 @@ "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, - "node_modules/jest-validate/node_modules/@jest/schemas": { - "version": "29.0.0", - "resolved": "https://registry.npmjs.org/@jest/schemas/-/schemas-29.0.0.tgz", - "integrity": "sha512-3Ab5HgYIIAnS0HjqJHQYZS+zXc4tUmTmBH3z83ajI6afXp8X3ZtdLX+nXx+I7LNkJD7uN9LAVhgnjDgZa2z0kA==", - "dev": true, - "dependencies": { - "@sinclair/typebox": "^0.24.1" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/jest-validate/node_modules/@jest/types": { - "version": "29.0.2", - "resolved": "https://registry.npmjs.org/@jest/types/-/types-29.0.2.tgz", - "integrity": "sha512-5WNMesBLmlkt1+fVkoCjHa0X3i3q8zc4QLTDkdHgCa2gyPZc7rdlZBWgVLqwS1860ZW5xJuCDwAzqbGaXIr/ew==", - "dev": true, - "dependencies": { - "@jest/schemas": "^29.0.0", - "@types/istanbul-lib-coverage": "^2.0.0", - "@types/istanbul-reports": "^3.0.0", - "@types/node": "*", - "@types/yargs": "^17.0.8", - "chalk": "^4.0.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/jest-validate/node_modules/camelcase": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.3.0.tgz", - "integrity": "sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==", - "dev": true, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/jest-watcher": { - "version": "29.0.2", - "resolved": "https://registry.npmjs.org/jest-watcher/-/jest-watcher-29.0.2.tgz", - "integrity": "sha512-ds2bV0oyUdYoyrUTv4Ga5uptz4cEvmmP/JzqDyzZZanvrIn8ipxg5l3SDOAIiyuAx1VdHd2FBzeXPFO5KPH8vQ==", - "dev": true, - "dependencies": { - "@jest/test-result": "^29.0.2", - "@jest/types": "^29.0.2", - "@types/node": "*", - "ansi-escapes": "^4.2.1", - "chalk": "^4.0.0", - "emittery": "^0.10.2", - "jest-util": "^29.0.2", - "string-length": "^4.0.1" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/jest-watcher/node_modules/@jest/schemas": { - "version": "29.0.0", - "resolved": "https://registry.npmjs.org/@jest/schemas/-/schemas-29.0.0.tgz", - "integrity": "sha512-3Ab5HgYIIAnS0HjqJHQYZS+zXc4tUmTmBH3z83ajI6afXp8X3ZtdLX+nXx+I7LNkJD7uN9LAVhgnjDgZa2z0kA==", - "dev": true, - "dependencies": { - "@sinclair/typebox": "^0.24.1" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/jest-watcher/node_modules/@jest/types": { - "version": "29.0.2", - "resolved": "https://registry.npmjs.org/@jest/types/-/types-29.0.2.tgz", - "integrity": "sha512-5WNMesBLmlkt1+fVkoCjHa0X3i3q8zc4QLTDkdHgCa2gyPZc7rdlZBWgVLqwS1860ZW5xJuCDwAzqbGaXIr/ew==", - "dev": true, - "dependencies": { - "@jest/schemas": "^29.0.0", - "@types/istanbul-lib-coverage": "^2.0.0", - "@types/istanbul-reports": "^3.0.0", - "@types/node": "*", - "@types/yargs": "^17.0.8", - "chalk": "^4.0.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/jest-watcher/node_modules/jest-util": { + "node_modules/jest-validate/node_modules/camelcase": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.3.0.tgz", + "integrity": "sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/jest-watcher": { "version": "29.0.2", - "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-29.0.2.tgz", - "integrity": "sha512-ozk8ruEEEACxqpz0hN9UOgtPZS0aN+NffwQduR5dVlhN+eN47vxurtvgZkYZYMpYrsmlAEx1XabkB3BnN0GfKQ==", + "resolved": "https://registry.npmjs.org/jest-watcher/-/jest-watcher-29.0.2.tgz", + "integrity": "sha512-ds2bV0oyUdYoyrUTv4Ga5uptz4cEvmmP/JzqDyzZZanvrIn8ipxg5l3SDOAIiyuAx1VdHd2FBzeXPFO5KPH8vQ==", "dev": true, "dependencies": { + "@jest/test-result": "^29.0.2", "@jest/types": "^29.0.2", "@types/node": "*", + "ansi-escapes": "^4.2.1", "chalk": "^4.0.0", - "ci-info": "^3.2.0", - "graceful-fs": "^4.2.9", - "picomatch": "^2.2.3" + "emittery": "^0.10.2", + "jest-util": "^29.0.2", + "string-length": "^4.0.1" }, "engines": { "node": "^14.15.0 || ^16.10.0 || >=18.0.0" @@ -6377,34 +5713,20 @@ "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" } }, - "node_modules/jest/node_modules/@jest/schemas": { - "version": "29.0.0", - "resolved": "https://registry.npmjs.org/@jest/schemas/-/schemas-29.0.0.tgz", - "integrity": "sha512-3Ab5HgYIIAnS0HjqJHQYZS+zXc4tUmTmBH3z83ajI6afXp8X3ZtdLX+nXx+I7LNkJD7uN9LAVhgnjDgZa2z0kA==", + "node_modules/jose": { + "version": "4.14.4", + "resolved": "https://registry.npmjs.org/jose/-/jose-4.14.4.tgz", + "integrity": "sha512-j8GhLiKmUAh+dsFXlX1aJCbt5KMibuKb+d7j1JaOJG6s2UjX1PQlW+OKB/sD4a/5ZYF4RcmYmLSndOoU3Lt/3g==", "dev": true, - "dependencies": { - "@sinclair/typebox": "^0.24.1" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + "funding": { + "url": "https://github.com/sponsors/panva" } }, - "node_modules/jest/node_modules/@jest/types": { - "version": "29.0.2", - "resolved": "https://registry.npmjs.org/@jest/types/-/types-29.0.2.tgz", - "integrity": "sha512-5WNMesBLmlkt1+fVkoCjHa0X3i3q8zc4QLTDkdHgCa2gyPZc7rdlZBWgVLqwS1860ZW5xJuCDwAzqbGaXIr/ew==", - "dev": true, - "dependencies": { - "@jest/schemas": "^29.0.0", - "@types/istanbul-lib-coverage": "^2.0.0", - "@types/istanbul-reports": "^3.0.0", - "@types/node": "*", - "@types/yargs": "^17.0.8", - "chalk": "^4.0.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } + "node_modules/js-md4": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/js-md4/-/js-md4-0.3.2.tgz", + "integrity": "sha512-/GDnfQYsltsjRswQhN9fhv3EMw2sCpUdrdxyWDOUK7eyD++r3gRhzgiQgc/x4MAv2i1iuQ4lxO5mvqM3vj4bwA==", + "dev": true }, "node_modules/js-sha512": { "version": "0.8.0", @@ -6479,9 +5801,9 @@ "dev": true }, "node_modules/json5": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.1.tgz", - "integrity": "sha512-1hqLFMSrGHRHxav9q9gNjJ5EXznIxGVO09xQRrwplcS8qs28pZ8s8hupZAmqDwZUmVZ2Qb2jnyPOWcDH8m8dlA==", + "version": "2.2.3", + "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz", + "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==", "dev": true, "bin": { "json5": "lib/cli.js" @@ -6753,6 +6075,12 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/minimalistic-assert": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz", + "integrity": "sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A==", + "dev": true + }, "node_modules/minimatch": { "version": "3.1.2", "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", @@ -6771,6 +6099,21 @@ "integrity": "sha512-Jsjnk4bw3YJqYzbdyBiNsPWHPfO++UGG749Cxs6peCu5Xg4nrena6OVxOYxrQTqww0Jmwt+Ref8rggumkTLz9Q==", "dev": true }, + "node_modules/mkdirp": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-3.0.1.tgz", + "integrity": "sha512-+NsyUUAZDmo6YVHzL/stxSu3t9YS1iljliy3BSDrXJ/dkn1KYdmtZODGGjLcc9XLgVVpH4KshHB8XmZgMhaBXg==", + "dev": true, + "bin": { + "mkdirp": "dist/cjs/src/bin.js" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, "node_modules/mkdirp-classic": { "version": "0.5.3", "resolved": "https://registry.npmjs.org/mkdirp-classic/-/mkdirp-classic-0.5.3.tgz", @@ -6884,64 +6227,38 @@ "dev": true }, "node_modules/newman": { - "version": "5.3.2", - "resolved": "https://registry.npmjs.org/newman/-/newman-5.3.2.tgz", - "integrity": "sha512-cWy8pV0iwvMOZLTw3hkAHcwo2ZA0GKkXm8oUMn1Ltii3ZI2nKpnrg9QGdIT0hGHChRkX6prY5e3Aar7uykMGNg==", + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/newman/-/newman-6.0.0.tgz", + "integrity": "sha512-QaANQC5b6ga348MezIVRI9ZmMs+cg3MdYIp0tSEauH2tmWOAR9+cghNsFJNjU9JPui3jJp1ALC7pQq6g3Jqpxw==", "dev": true, "dependencies": { - "async": "3.2.3", - "chardet": "1.4.0", - "cli-progress": "3.10.0", - "cli-table3": "0.6.1", + "@postman/tough-cookie": "4.1.3-postman.1", + "async": "3.2.4", + "chardet": "1.6.0", + "cli-progress": "3.12.0", + "cli-table3": "0.6.3", "colors": "1.4.0", - "commander": "7.2.0", + "commander": "11.0.0", "csv-parse": "4.16.3", - "eventemitter3": "4.0.7", - "filesize": "8.0.7", + "filesize": "10.0.12", + "liquid-json": "0.3.1", "lodash": "4.17.21", - "mkdirp": "1.0.4", - "postman-collection": "4.1.1", - "postman-collection-transformer": "4.1.6", - "postman-request": "2.88.1-postman.31", - "postman-runtime": "7.29.0", + "mkdirp": "3.0.1", + "postman-collection": "4.2.1", + "postman-collection-transformer": "4.1.7", + "postman-request": "2.88.1-postman.33", + "postman-runtime": "7.33.0", "pretty-ms": "7.0.1", - "semver": "7.3.5", + "semver": "7.5.4", "serialised-error": "1.1.3", - "tough-cookie": "3.0.1", - "word-wrap": "1.2.3", + "word-wrap": "1.2.5", "xmlbuilder": "15.1.1" }, "bin": { "newman": "bin/newman.js" }, "engines": { - "node": ">=10" - } - }, - "node_modules/newman/node_modules/mkdirp": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", - "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==", - "dev": true, - "bin": { - "mkdirp": "bin/cmd.js" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/newman/node_modules/tough-cookie": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-3.0.1.tgz", - "integrity": "sha512-yQyJ0u4pZsv9D4clxO69OEjLWYw+jbgspjTue4lTQZLfV0c5l1VmK2y1JK8E9ahdpltPOaAThPcp5nKPUgSnsg==", - "dev": true, - "dependencies": { - "ip-regex": "^2.1.0", - "psl": "^1.1.28", - "punycode": "^2.1.1" - }, - "engines": { - "node": ">=6" + "node": ">=16" } }, "node_modules/node-abi": { @@ -7055,7 +6372,6 @@ "version": "4.1.1", "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", "integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==", - "dev": true, "engines": { "node": ">=0.10.0" } @@ -7401,21 +6717,21 @@ } }, "node_modules/postman-collection": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/postman-collection/-/postman-collection-4.1.1.tgz", - "integrity": "sha512-ODpJtlf8r99DMcTU7gFmi/yvQYckFzcuE6zL/fWnyrFT34ugdCBFlX+DN7M+AnP6lmR822fv5s60H4DnL4+fAg==", + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/postman-collection/-/postman-collection-4.2.1.tgz", + "integrity": "sha512-DFLt3/yu8+ldtOTIzmBUctoupKJBOVK4NZO0t68K2lIir9smQg7OdQTBjOXYy+PDh7u0pSDvD66tm93eBHEPHA==", "dev": true, "dependencies": { - "faker": "5.5.3", + "@faker-js/faker": "5.5.3", "file-type": "3.9.0", "http-reasons": "0.1.0", "iconv-lite": "0.6.3", "liquid-json": "0.3.1", "lodash": "4.17.21", "mime-format": "2.0.1", - "mime-types": "2.1.34", + "mime-types": "2.1.35", "postman-url-encoder": "3.0.5", - "semver": "7.3.5", + "semver": "7.5.4", "uuid": "8.3.2" }, "engines": { @@ -7423,15 +6739,15 @@ } }, "node_modules/postman-collection-transformer": { - "version": "4.1.6", - "resolved": "https://registry.npmjs.org/postman-collection-transformer/-/postman-collection-transformer-4.1.6.tgz", - "integrity": "sha512-xvdQb6sZoWcG9xZXUPSuxocjcd6WCZlINlGGiuHdSfxhgiwQhj9qhF0JRFbagZ8xB0+pYUairD5MiCENc6DEVA==", + "version": "4.1.7", + "resolved": "https://registry.npmjs.org/postman-collection-transformer/-/postman-collection-transformer-4.1.7.tgz", + "integrity": "sha512-SxJkm/LnlFZs2splUBnS4jQFicgBptghpm4voHtNnaum3Ad64E2MHLV4fJhv58dVUmFwdSwdQUN3m2q0iLecnQ==", "dev": true, "dependencies": { "commander": "8.3.0", "inherits": "2.0.4", "lodash": "4.17.21", - "semver": "7.3.5", + "semver": "7.5.4", "strip-json-comments": "3.1.1" }, "bin": { @@ -7462,27 +6778,6 @@ "node": ">=0.10.0" } }, - "node_modules/postman-collection/node_modules/mime-db": { - "version": "1.51.0", - "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.51.0.tgz", - "integrity": "sha512-5y8A56jg7XVQx2mbv1lu49NR4dokRnhZYTtL+KGfaa27uq4pSTXkwQkFJl4pkRMyNFz/EtYDSkiiEHx3F7UN6g==", - "dev": true, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/postman-collection/node_modules/mime-types": { - "version": "2.1.34", - "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.34.tgz", - "integrity": "sha512-6cP692WwGIs9XXdOO4++N+7qjqv0rqxxVvJ3VHPh/Sc9mVZcQP+ZGhkKiTvWMQRr2tbHkJP/Yn7Y0npb3ZBs4A==", - "dev": true, - "dependencies": { - "mime-db": "1.51.0" - }, - "engines": { - "node": ">= 0.6" - } - }, "node_modules/postman-collection/node_modules/uuid": { "version": "8.3.2", "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz", @@ -7493,16 +6788,17 @@ } }, "node_modules/postman-request": { - "version": "2.88.1-postman.31", - "resolved": "https://registry.npmjs.org/postman-request/-/postman-request-2.88.1-postman.31.tgz", - "integrity": "sha512-OJbYqP7ItxQ84yHyuNpDywCZB0HYbpHJisMQ9lb1cSL3N5H3Td6a2+3l/a74UMd3u82BiGC5yQyYmdOIETP/nQ==", + "version": "2.88.1-postman.33", + "resolved": "https://registry.npmjs.org/postman-request/-/postman-request-2.88.1-postman.33.tgz", + "integrity": "sha512-uL9sCML4gPH6Z4hreDWbeinKU0p0Ke261nU7OvII95NU22HN6Dk7T/SaVPaj6T4TsQqGKIFw6/woLZnH7ugFNA==", "dev": true, "dependencies": { "@postman/form-data": "~3.1.1", + "@postman/tough-cookie": "~4.1.3-postman.1", "@postman/tunnel-agent": "^0.6.3", "aws-sign2": "~0.7.0", - "aws4": "^1.8.0", - "brotli": "~1.3.2", + "aws4": "^1.12.0", + "brotli": "^1.3.3", "caseless": "~0.12.0", "combined-stream": "~1.0.6", "extend": "~3.0.2", @@ -7512,14 +6808,13 @@ "is-typedarray": "~1.0.0", "isstream": "~0.1.2", "json-stringify-safe": "~5.0.1", - "mime-types": "~2.1.19", + "mime-types": "^2.1.35", "oauth-sign": "~0.9.0", "performance-now": "^2.1.0", - "qs": "~6.5.2", + "qs": "~6.5.3", "safe-buffer": "^5.1.2", "stream-length": "^1.0.2", - "tough-cookie": "~2.5.0", - "uuid": "^3.3.2" + "uuid": "^8.3.2" }, "engines": { "node": ">= 6" @@ -7535,75 +6830,75 @@ } }, "node_modules/postman-request/node_modules/uuid": { - "version": "3.4.0", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.4.0.tgz", - "integrity": "sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A==", - "deprecated": "Please upgrade to version 7 or higher. Older versions may use Math.random() in certain circumstances, which is known to be problematic. See https://v8.dev/blog/math-random for details.", + "version": "8.3.2", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz", + "integrity": "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==", "dev": true, "bin": { - "uuid": "bin/uuid" + "uuid": "dist/bin/uuid" } }, "node_modules/postman-runtime": { - "version": "7.29.0", - "resolved": "https://registry.npmjs.org/postman-runtime/-/postman-runtime-7.29.0.tgz", - "integrity": "sha512-eXxHREE/fUpohkGPRgBY1YccSGx9cyW3mtGiPyIE4zD5fYzasgBHqW6kbEND3Xrd3yf/uht/YI1H8O7J1+A1+w==", + "version": "7.33.0", + "resolved": "https://registry.npmjs.org/postman-runtime/-/postman-runtime-7.33.0.tgz", + "integrity": "sha512-cYCb+5Y12FwZU/T3gOj2SKiOz38pisVLc0tdppb+ZlG7iqn5aLgxghJwhjG62pZCV6uixKiQX1hNdLSk9a9Xtw==", "dev": true, "dependencies": { - "async": "3.2.3", - "aws4": "1.11.0", - "handlebars": "4.7.7", - "httpntlm": "1.7.7", + "@postman/tough-cookie": "4.1.3-postman.1", + "async": "3.2.4", + "aws4": "1.12.0", + "handlebars": "4.7.8", + "httpntlm": "1.8.13", + "jose": "4.14.4", "js-sha512": "0.8.0", "lodash": "4.17.21", - "mime-types": "2.1.34", + "mime-types": "2.1.35", "node-oauth1": "1.3.0", "performance-now": "2.1.0", - "postman-collection": "4.1.1", - "postman-request": "2.88.1-postman.31", - "postman-sandbox": "4.0.6", + "postman-collection": "4.2.0", + "postman-request": "2.88.1-postman.33", + "postman-sandbox": "4.2.7", "postman-url-encoder": "3.0.5", "serialised-error": "1.1.3", - "tough-cookie": "3.0.1", + "strip-json-comments": "3.1.1", "uuid": "8.3.2" }, "engines": { - "node": ">=10" - } - }, - "node_modules/postman-runtime/node_modules/mime-db": { - "version": "1.51.0", - "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.51.0.tgz", - "integrity": "sha512-5y8A56jg7XVQx2mbv1lu49NR4dokRnhZYTtL+KGfaa27uq4pSTXkwQkFJl4pkRMyNFz/EtYDSkiiEHx3F7UN6g==", - "dev": true, - "engines": { - "node": ">= 0.6" + "node": ">=12" } }, - "node_modules/postman-runtime/node_modules/mime-types": { - "version": "2.1.34", - "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.34.tgz", - "integrity": "sha512-6cP692WwGIs9XXdOO4++N+7qjqv0rqxxVvJ3VHPh/Sc9mVZcQP+ZGhkKiTvWMQRr2tbHkJP/Yn7Y0npb3ZBs4A==", + "node_modules/postman-runtime/node_modules/iconv-lite": { + "version": "0.6.3", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz", + "integrity": "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==", "dev": true, "dependencies": { - "mime-db": "1.51.0" + "safer-buffer": ">= 2.1.2 < 3.0.0" }, "engines": { - "node": ">= 0.6" + "node": ">=0.10.0" } }, - "node_modules/postman-runtime/node_modules/tough-cookie": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-3.0.1.tgz", - "integrity": "sha512-yQyJ0u4pZsv9D4clxO69OEjLWYw+jbgspjTue4lTQZLfV0c5l1VmK2y1JK8E9ahdpltPOaAThPcp5nKPUgSnsg==", + "node_modules/postman-runtime/node_modules/postman-collection": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/postman-collection/-/postman-collection-4.2.0.tgz", + "integrity": "sha512-tvOLgN1h6Kab6dt43PmBoV5kYO/YUta3x0C2QqfmbzmHZe47VTpZ/+gIkGlbNhjKNPUUub5X6ehxYKoaTYdy1w==", "dev": true, "dependencies": { - "ip-regex": "^2.1.0", - "psl": "^1.1.28", - "punycode": "^2.1.1" + "@faker-js/faker": "5.5.3", + "file-type": "3.9.0", + "http-reasons": "0.1.0", + "iconv-lite": "0.6.3", + "liquid-json": "0.3.1", + "lodash": "4.17.21", + "mime-format": "2.0.1", + "mime-types": "2.1.35", + "postman-url-encoder": "3.0.5", + "semver": "7.5.4", + "uuid": "8.3.2" }, "engines": { - "node": ">=6" + "node": ">=10" } }, "node_modules/postman-runtime/node_modules/uuid": { @@ -7616,19 +6911,63 @@ } }, "node_modules/postman-sandbox": { - "version": "4.0.6", - "resolved": "https://registry.npmjs.org/postman-sandbox/-/postman-sandbox-4.0.6.tgz", - "integrity": "sha512-PPRanSNEE4zy3kO7CeSBHmAfJnGdD9ecHY/Mjh26CQuZZarGkNO8c0U/n+xX3+5M1BRNc82UYq6YCtdsSDqcng==", + "version": "4.2.7", + "resolved": "https://registry.npmjs.org/postman-sandbox/-/postman-sandbox-4.2.7.tgz", + "integrity": "sha512-/EcCrKnb/o+9iLS4u+H76E0kBomJFjPptVjoDiq1uZ7Es/4aTv0MAX+0aoDxdDO+0h9sl8vy65uKQwyjN7AOaw==", "dev": true, "dependencies": { "lodash": "4.17.21", + "postman-collection": "4.2.0", "teleport-javascript": "1.0.0", - "uvm": "2.0.2" + "uvm": "2.1.1" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/postman-sandbox/node_modules/iconv-lite": { + "version": "0.6.3", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz", + "integrity": "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==", + "dev": true, + "dependencies": { + "safer-buffer": ">= 2.1.2 < 3.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/postman-sandbox/node_modules/postman-collection": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/postman-collection/-/postman-collection-4.2.0.tgz", + "integrity": "sha512-tvOLgN1h6Kab6dt43PmBoV5kYO/YUta3x0C2QqfmbzmHZe47VTpZ/+gIkGlbNhjKNPUUub5X6ehxYKoaTYdy1w==", + "dev": true, + "dependencies": { + "@faker-js/faker": "5.5.3", + "file-type": "3.9.0", + "http-reasons": "0.1.0", + "iconv-lite": "0.6.3", + "liquid-json": "0.3.1", + "lodash": "4.17.21", + "mime-format": "2.0.1", + "mime-types": "2.1.35", + "postman-url-encoder": "3.0.5", + "semver": "7.5.4", + "uuid": "8.3.2" }, "engines": { "node": ">=10" } }, + "node_modules/postman-sandbox/node_modules/uuid": { + "version": "8.3.2", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz", + "integrity": "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==", + "dev": true, + "bin": { + "uuid": "dist/bin/uuid" + } + }, "node_modules/postman-url-encoder": { "version": "3.0.5", "resolved": "https://registry.npmjs.org/postman-url-encoder/-/postman-url-encoder-3.0.5.tgz", @@ -7771,9 +7110,9 @@ } }, "node_modules/psl": { - "version": "1.8.0", - "resolved": "https://registry.npmjs.org/psl/-/psl-1.8.0.tgz", - "integrity": "sha512-RIdOzyoavK+hA18OGGWDqUTsCLhtA7IcZ/6NCs4fFJaHBDab+pDDmDIByWFRQJq2Cd7r1OoQxBGKOaztq+hjIQ==", + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/psl/-/psl-1.9.0.tgz", + "integrity": "sha512-E/ZsdU4HLs/68gYzgGTkMicWTLPdAftJLfJFlLUAAKZGkStNU72sZjT66SnMDVOfOWY/YAoiD7Jxa9iHvngcag==", "dev": true }, "node_modules/pump": { @@ -7809,6 +7148,12 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/querystringify": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/querystringify/-/querystringify-2.2.0.tgz", + "integrity": "sha512-FIqgj2EUvTa7R50u0rGsyTftzjYmv/a3hO345bZNrqabNqjtgiDMgmo4mkUjd+nzU5oF3dClKqFIPUKybUyqoQ==", + "dev": true + }, "node_modules/queue-microtask": { "version": "1.2.3", "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", @@ -7917,6 +7262,12 @@ "node": ">=0.10.0" } }, + "node_modules/requires-port": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/requires-port/-/requires-port-1.0.0.tgz", + "integrity": "sha512-KigOCHcocU3XODJxsu8i/j8T9tzT4adHiecwORRQ0ZZFcp7ahwXuRU1m+yuO90C5ZUyGeGfocHDI14M3L3yDAQ==", + "dev": true + }, "node_modules/resolve": { "version": "1.22.0", "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.0.tgz", @@ -8032,9 +7383,9 @@ "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==" }, "node_modules/semver": { - "version": "7.3.5", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.5.tgz", - "integrity": "sha512-PoeGJYh8HK4BTO/a9Tf6ZG3veo/A7ZVsYrSA6J8ny9nb3B1VrpkuN+z9OE5wfE5p6H4LchYZsegiQgbJD94ZFQ==", + "version": "7.5.4", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz", + "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==", "dev": true, "dependencies": { "lru-cache": "^6.0.0" @@ -8256,9 +7607,9 @@ "dev": true }, "node_modules/sshpk": { - "version": "1.17.0", - "resolved": "https://registry.npmjs.org/sshpk/-/sshpk-1.17.0.tgz", - "integrity": "sha512-/9HIEs1ZXGhSPE8X6Ccm7Nam1z8KcoCqPdI7ecm1N33EzAetWahvQWVqLZtaZQ+IDKX4IyA2o0gBzqIMkAagHQ==", + "version": "1.18.0", + "resolved": "https://registry.npmjs.org/sshpk/-/sshpk-1.18.0.tgz", + "integrity": "sha512-2p2KJZTSqQ/I3+HX42EpYOa2l3f8Erv8MWKsy2I9uf4wA7yFIkXRffYdsx86y6z4vHtV8u7g+pPlr8/4ouAxsQ==", "dev": true, "dependencies": { "asn1": "~0.2.3", @@ -8283,7 +7634,7 @@ "node_modules/stack-trace": { "version": "0.0.9", "resolved": "https://registry.npmjs.org/stack-trace/-/stack-trace-0.0.9.tgz", - "integrity": "sha1-qPbq7KkGdMMz58Q5U/J1tFFRBpU=", + "integrity": "sha512-vjUc6sfgtgY0dxCdnc40mK6Oftjo9+2K8H/NG81TMhgL392FtiPA9tn9RLyTxXmTLPJPjF3VyzFp6bsWFLisMQ==", "dev": true, "engines": { "node": "*" @@ -8321,7 +7672,7 @@ "node_modules/stream-length": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/stream-length/-/stream-length-1.0.2.tgz", - "integrity": "sha1-gnfzy+5JpNqrz9tOL0qbXp8snwA=", + "integrity": "sha512-aI+qKFiwoDV4rsXiS7WRoCt+v2RX1nUj17+KJC5r2gfh5xoSJIfP6Y3Do/HtvesFcTSWthIuJ3l1cvKQY/+nZg==", "dev": true, "dependencies": { "bluebird": "^2.6.2" @@ -8570,19 +7921,6 @@ "node": ">=0.6" } }, - "node_modules/tough-cookie": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.5.0.tgz", - "integrity": "sha512-nlLsUzgm1kfLXSXfRZMc1KLAugd4hqJHDTvc2hDIwS3mZAfMEuMbc03SujMF+GEcpaX/qboeycw6iO8JwVv2+g==", - "dev": true, - "dependencies": { - "psl": "^1.1.28", - "punycode": "^2.1.1" - }, - "engines": { - "node": ">=0.8" - } - }, "node_modules/tr46": { "version": "0.0.3", "resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz", @@ -8590,32 +7928,32 @@ "dev": true }, "node_modules/ts-jest": { - "version": "28.0.8", - "resolved": "https://registry.npmjs.org/ts-jest/-/ts-jest-28.0.8.tgz", - "integrity": "sha512-5FaG0lXmRPzApix8oFG8RKjAz4ehtm8yMKOTy5HX3fY6W8kmvOrmcY0hKDElW52FJov+clhUbrKAqofnj4mXTg==", + "version": "29.1.1", + "resolved": "https://registry.npmmirror.com/ts-jest/-/ts-jest-29.1.1.tgz", + "integrity": "sha512-D6xjnnbP17cC85nliwGiL+tpoKN0StpgE0TeOjXQTU6MVCfsB4v7aW05CgQ/1OywGb0x/oy9hHFnN+sczTiRaA==", "dev": true, "dependencies": { "bs-logger": "0.x", "fast-json-stable-stringify": "2.x", - "jest-util": "^28.0.0", - "json5": "^2.2.1", + "jest-util": "^29.0.0", + "json5": "^2.2.3", "lodash.memoize": "4.x", "make-error": "1.x", - "semver": "7.x", + "semver": "^7.5.3", "yargs-parser": "^21.0.1" }, "bin": { "ts-jest": "cli.js" }, "engines": { - "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" }, "peerDependencies": { "@babel/core": ">=7.0.0-beta.0 <8", - "@jest/types": "^28.0.0", - "babel-jest": "^28.0.0", - "jest": "^28.0.0", - "typescript": ">=4.3" + "@jest/types": "^29.0.0", + "babel-jest": "^29.0.0", + "jest": "^29.0.0", + "typescript": ">=4.3 <6" }, "peerDependenciesMeta": { "@babel/core": { @@ -8711,7 +8049,7 @@ "node_modules/tweetnacl": { "version": "0.14.5", "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-0.14.5.tgz", - "integrity": "sha1-WuaBd/GS1EViadEIr6k/+HQ/T2Q=", + "integrity": "sha512-KXXFFdAbFXY4geFIwoyNK+f5Z1b7swfXABfL7HXCmoIWMKU3dmS26672A4EeQtDzLKy7SXmfBu51JolvEKwtGA==", "dev": true }, "node_modules/type-check": { @@ -8773,9 +8111,9 @@ } }, "node_modules/uglify-js": { - "version": "3.16.0", - "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-3.16.0.tgz", - "integrity": "sha512-FEikl6bR30n0T3amyBh3LoiBdqHRy/f4H80+My34HOesOKyHfOsxAPAxOoqC0JUnC1amnO0IwkYC3sko51caSw==", + "version": "3.17.4", + "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-3.17.4.tgz", + "integrity": "sha512-T9q82TJI9e/C1TAxYvfb16xO120tMVFZrGA3f9/P4424DNu6ypK103y0GPFVa17yotwSyZW5iYXgjYHkGrJW/g==", "dev": true, "optional": true, "bin": { @@ -8817,6 +8155,16 @@ "punycode": "^2.1.0" } }, + "node_modules/url-parse": { + "version": "1.5.10", + "resolved": "https://registry.npmjs.org/url-parse/-/url-parse-1.5.10.tgz", + "integrity": "sha512-WypcfiRhfeUP9vvF0j6rw0J3hrWrw6iZv3+22h6iRMJ/8z1Tj6XfLP4DsUix5MhMPnXpiHDoKyoZ/bdCkwBCiQ==", + "dev": true, + "dependencies": { + "querystringify": "^2.1.1", + "requires-port": "^1.0.0" + } + }, "node_modules/util-deprecate": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", @@ -8840,23 +8188,17 @@ } }, "node_modules/uvm": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/uvm/-/uvm-2.0.2.tgz", - "integrity": "sha512-Ra+aPiS5GXAbwXmyNExqdS42sTqmmx4XWEDF8uJlsTfOkKf9Rd9xNgav1Yckv4HfVEZg4iOFODWHFYuJ+9Fzfg==", + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/uvm/-/uvm-2.1.1.tgz", + "integrity": "sha512-BZ5w8adTpNNr+zczOBRpaX/hH8UPKAf7fmCnidrcsqt3bn8KT9bDIfuS7hgRU9RXgiN01su2pwysBONY6w8W5w==", "dev": true, "dependencies": { - "flatted": "3.1.1" + "flatted": "3.2.6" }, "engines": { "node": ">=10" } }, - "node_modules/uvm/node_modules/flatted": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.1.1.tgz", - "integrity": "sha512-zAoAQiudy+r5SvnSw3KJy5os/oRJYHzrzja/tBDqrZtNhUw8bt6y8OBzMWcjWr+8liV8Eb6yOhw8WZ7VFZ5ZzA==", - "dev": true - }, "node_modules/v8-compile-cache-lib": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/v8-compile-cache-lib/-/v8-compile-cache-lib-3.0.1.tgz", @@ -8888,7 +8230,7 @@ "node_modules/verror": { "version": "1.10.0", "resolved": "https://registry.npmjs.org/verror/-/verror-1.10.0.tgz", - "integrity": "sha1-OhBcoXBTr1XW4nDB+CiGguGNpAA=", + "integrity": "sha512-ZZKSmDAEFOijERBLkmYfJ+vmk3w+7hOLYDNkRCuRuMJGEmqYNCNLyBBFwWKVMhfwaEF3WOd0Zlw86U/WC/+nYw==", "dev": true, "engines": [ "node >=0.6.0" @@ -8955,9 +8297,9 @@ } }, "node_modules/word-wrap": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.3.tgz", - "integrity": "sha512-Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ==", + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.5.tgz", + "integrity": "sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA==", "dev": true, "engines": { "node": ">=0.10.0" @@ -8966,7 +8308,7 @@ "node_modules/wordwrap": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-1.0.0.tgz", - "integrity": "sha1-J1hIEIkUVqQXHI0CJkQa3pDLyus=", + "integrity": "sha512-gvVzJFlPycKc5dZN4yPkP8w7Dc37BtP1yczEneOb4uq34pXZcvrtRTmWV8W+Ume+XCxKgbjM+nevkyFPMybd4Q==", "dev": true }, "node_modules/wrap-ansi": { @@ -9110,12 +8452,71 @@ } }, "@babel/code-frame": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.16.7.tgz", - "integrity": "sha512-iAXqUn8IIeBTNd72xsFlgaXHkMBMt6y4HJp1tIaK465CWLT/fG1aqB7ykr95gHHmlBdGbFeWWfyB4NJJ0nmeIg==", + "version": "7.22.13", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.22.13.tgz", + "integrity": "sha512-XktuhWlJ5g+3TJXc5upd9Ks1HutSArik6jf2eAjYFyIOf4ej3RN+184cZbzDvbPnuTJIUhPKKJE3cIsYTiAT3w==", "dev": true, "requires": { - "@babel/highlight": "^7.16.7" + "@babel/highlight": "^7.22.13", + "chalk": "^2.4.2" + }, + "dependencies": { + "ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "dev": true, + "requires": { + "color-convert": "^1.9.0" + } + }, + "chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "dev": true, + "requires": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + } + }, + "color-convert": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "dev": true, + "requires": { + "color-name": "1.1.3" + } + }, + "color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", + "dev": true + }, + "escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", + "dev": true + }, + "has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", + "dev": true + }, + "supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dev": true, + "requires": { + "has-flag": "^3.0.0" + } + } } }, "@babel/compat-data": { @@ -9200,28 +8601,54 @@ } }, "@babel/helper-environment-visitor": { - "version": "7.18.2", - "resolved": "https://registry.npmjs.org/@babel/helper-environment-visitor/-/helper-environment-visitor-7.18.2.tgz", - "integrity": "sha512-14GQKWkX9oJzPiQQ7/J36FTXcD4kSp8egKjO9nINlSKiHITRA9q/R74qu8S9xlc/b/yjsJItQUeeh3xnGN0voQ==", + "version": "7.22.20", + "resolved": "https://registry.npmjs.org/@babel/helper-environment-visitor/-/helper-environment-visitor-7.22.20.tgz", + "integrity": "sha512-zfedSIzFhat/gFhWfHtgWvlec0nqB9YEIVrpuwjruLlXfUSnA8cJB0miHKwqDnQ7d32aKo2xt88/xZptwxbfhA==", "dev": true }, "@babel/helper-function-name": { - "version": "7.17.9", - "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.17.9.tgz", - "integrity": "sha512-7cRisGlVtiVqZ0MW0/yFB4atgpGLWEHUVYnb448hZK4x+vih0YO5UoS11XIYtZYqHd0dIPMdUSv8q5K4LdMnIg==", + "version": "7.23.0", + "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.23.0.tgz", + "integrity": "sha512-OErEqsrxjZTJciZ4Oo+eoZqeW9UIiOcuYKRJA4ZAgV9myA+pOXhhmpfNCKjEH/auVfEYVFJ6y1Tc4r0eIApqiw==", "dev": true, "requires": { - "@babel/template": "^7.16.7", - "@babel/types": "^7.17.0" + "@babel/template": "^7.22.15", + "@babel/types": "^7.23.0" + }, + "dependencies": { + "@babel/types": { + "version": "7.23.0", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.23.0.tgz", + "integrity": "sha512-0oIyUfKoI3mSqMvsxBdclDwxXKXAUA8v/apZbc+iSyARYou1o8ZGDxbUYyLFoW2arqS2jDGqJuZvv1d/io1axg==", + "dev": true, + "requires": { + "@babel/helper-string-parser": "^7.22.5", + "@babel/helper-validator-identifier": "^7.22.20", + "to-fast-properties": "^2.0.0" + } + } } }, "@babel/helper-hoist-variables": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.16.7.tgz", - "integrity": "sha512-m04d/0Op34H5v7pbZw6pSKP7weA6lsMvfiIAMeIvkY/R4xQtBSMFEigu9QTZ2qB/9l22vsxtM8a+Q8CzD255fg==", + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.22.5.tgz", + "integrity": "sha512-wGjk9QZVzvknA6yKIUURb8zY3grXCcOZt+/7Wcy8O2uctxhplmUPkOdlgoNhmdVee2c92JXbf1xpMtVNbfoxRw==", "dev": true, "requires": { - "@babel/types": "^7.16.7" + "@babel/types": "^7.22.5" + }, + "dependencies": { + "@babel/types": { + "version": "7.23.0", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.23.0.tgz", + "integrity": "sha512-0oIyUfKoI3mSqMvsxBdclDwxXKXAUA8v/apZbc+iSyARYou1o8ZGDxbUYyLFoW2arqS2jDGqJuZvv1d/io1axg==", + "dev": true, + "requires": { + "@babel/helper-string-parser": "^7.22.5", + "@babel/helper-validator-identifier": "^7.22.20", + "to-fast-properties": "^2.0.0" + } + } } }, "@babel/helper-module-imports": { @@ -9265,18 +8692,37 @@ } }, "@babel/helper-split-export-declaration": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.16.7.tgz", - "integrity": "sha512-xbWoy/PFoxSWazIToT9Sif+jJTlrMcndIsaOKvTA6u7QEo7ilkRZpjew18/W3c7nm8fXdUDXh02VXTbZ0pGDNw==", + "version": "7.22.6", + "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.22.6.tgz", + "integrity": "sha512-AsUnxuLhRYsisFiaJwvp1QF+I3KjD5FOxut14q/GzovUe6orHLesW2C7d754kRm53h5gqrz6sFl6sxc4BVtE/g==", "dev": true, "requires": { - "@babel/types": "^7.16.7" + "@babel/types": "^7.22.5" + }, + "dependencies": { + "@babel/types": { + "version": "7.23.0", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.23.0.tgz", + "integrity": "sha512-0oIyUfKoI3mSqMvsxBdclDwxXKXAUA8v/apZbc+iSyARYou1o8ZGDxbUYyLFoW2arqS2jDGqJuZvv1d/io1axg==", + "dev": true, + "requires": { + "@babel/helper-string-parser": "^7.22.5", + "@babel/helper-validator-identifier": "^7.22.20", + "to-fast-properties": "^2.0.0" + } + } } }, + "@babel/helper-string-parser": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.22.5.tgz", + "integrity": "sha512-mM4COjgZox8U+JcXQwPijIZLElkgEpO5rsERVDJTc2qfCDfERyob6k5WegS14SX18IIjv+XD+GrqNumY5JRCDw==", + "dev": true + }, "@babel/helper-validator-identifier": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.16.7.tgz", - "integrity": "sha512-hsEnFemeiW4D08A5gUAZxLBTXpZ39P+a+DGDsHw1yxqyQ/jzFEnxf5uTEGp+3bzAbNOxU1paTgYS4ECU/IgfDw==", + "version": "7.22.20", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.22.20.tgz", + "integrity": "sha512-Y4OZ+ytlatR8AI+8KZfKuL5urKp7qey08ha31L8b3BwewJAoJamTzyvxPR/5D+KkdJCGPq/+8TukHBlY10FX9A==", "dev": true }, "@babel/helper-validator-option": { @@ -9297,13 +8743,13 @@ } }, "@babel/highlight": { - "version": "7.17.12", - "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.17.12.tgz", - "integrity": "sha512-7yykMVF3hfZY2jsHZEEgLc+3x4o1O+fYyULu11GynEUQNwB6lua+IIQn1FiJxNucd5UlyJryrwsOh8PL9Sn8Qg==", + "version": "7.22.20", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.22.20.tgz", + "integrity": "sha512-dkdMCN3py0+ksCgYmGG8jKeGA/8Tk+gJwSYYlFGxG5lmhfKNoAy004YpLxpS1W2J8m/EK2Ew+yOs9pVRwO89mg==", "dev": true, "requires": { - "@babel/helper-validator-identifier": "^7.16.7", - "chalk": "^2.0.0", + "@babel/helper-validator-identifier": "^7.22.20", + "chalk": "^2.4.2", "js-tokens": "^4.0.0" }, "dependencies": { @@ -9498,34 +8944,93 @@ } }, "@babel/template": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.16.7.tgz", - "integrity": "sha512-I8j/x8kHUrbYRTUxXrrMbfCa7jxkE7tZre39x3kjr9hvI82cK1FfqLygotcWN5kdPGWcLdWMHpSBavse5tWw3w==", + "version": "7.22.15", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.22.15.tgz", + "integrity": "sha512-QPErUVm4uyJa60rkI73qneDacvdvzxshT3kksGqlGWYdOTIUOwJ7RDUL8sGqslY1uXWSL6xMFKEXDS3ox2uF0w==", "dev": true, "requires": { - "@babel/code-frame": "^7.16.7", - "@babel/parser": "^7.16.7", - "@babel/types": "^7.16.7" + "@babel/code-frame": "^7.22.13", + "@babel/parser": "^7.22.15", + "@babel/types": "^7.22.15" + }, + "dependencies": { + "@babel/parser": { + "version": "7.23.0", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.23.0.tgz", + "integrity": "sha512-vvPKKdMemU85V9WE/l5wZEmImpCtLqbnTvqDS2U1fJ96KrxoW7KrXhNsNCblQlg8Ck4b85yxdTyelsMUgFUXiw==", + "dev": true + }, + "@babel/types": { + "version": "7.23.0", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.23.0.tgz", + "integrity": "sha512-0oIyUfKoI3mSqMvsxBdclDwxXKXAUA8v/apZbc+iSyARYou1o8ZGDxbUYyLFoW2arqS2jDGqJuZvv1d/io1axg==", + "dev": true, + "requires": { + "@babel/helper-string-parser": "^7.22.5", + "@babel/helper-validator-identifier": "^7.22.20", + "to-fast-properties": "^2.0.0" + } + } } }, "@babel/traverse": { - "version": "7.18.2", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.18.2.tgz", - "integrity": "sha512-9eNwoeovJ6KH9zcCNnENY7DMFwTU9JdGCFtqNLfUAqtUHRCOsTOqWoffosP8vKmNYeSBUv3yVJXjfd8ucwOjUA==", - "dev": true, - "requires": { - "@babel/code-frame": "^7.16.7", - "@babel/generator": "^7.18.2", - "@babel/helper-environment-visitor": "^7.18.2", - "@babel/helper-function-name": "^7.17.9", - "@babel/helper-hoist-variables": "^7.16.7", - "@babel/helper-split-export-declaration": "^7.16.7", - "@babel/parser": "^7.18.0", - "@babel/types": "^7.18.2", + "version": "7.23.2", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.23.2.tgz", + "integrity": "sha512-azpe59SQ48qG6nu2CzcMLbxUudtN+dOM9kDbUqGq3HXUJRlo7i8fvPoxQUzYgLZ4cMVmuZgm8vvBpNeRhd6XSw==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.22.13", + "@babel/generator": "^7.23.0", + "@babel/helper-environment-visitor": "^7.22.20", + "@babel/helper-function-name": "^7.23.0", + "@babel/helper-hoist-variables": "^7.22.5", + "@babel/helper-split-export-declaration": "^7.22.6", + "@babel/parser": "^7.23.0", + "@babel/types": "^7.23.0", "debug": "^4.1.0", "globals": "^11.1.0" }, "dependencies": { + "@babel/generator": { + "version": "7.23.0", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.23.0.tgz", + "integrity": "sha512-lN85QRR+5IbYrMWM6Y4pE/noaQtg4pNiqeNGX60eqOfo6gtEj6uw/JagelB8vVztSd7R6M5n1+PQkDbHbBRU4g==", + "dev": true, + "requires": { + "@babel/types": "^7.23.0", + "@jridgewell/gen-mapping": "^0.3.2", + "@jridgewell/trace-mapping": "^0.3.17", + "jsesc": "^2.5.1" + } + }, + "@babel/parser": { + "version": "7.23.0", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.23.0.tgz", + "integrity": "sha512-vvPKKdMemU85V9WE/l5wZEmImpCtLqbnTvqDS2U1fJ96KrxoW7KrXhNsNCblQlg8Ck4b85yxdTyelsMUgFUXiw==", + "dev": true + }, + "@babel/types": { + "version": "7.23.0", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.23.0.tgz", + "integrity": "sha512-0oIyUfKoI3mSqMvsxBdclDwxXKXAUA8v/apZbc+iSyARYou1o8ZGDxbUYyLFoW2arqS2jDGqJuZvv1d/io1axg==", + "dev": true, + "requires": { + "@babel/helper-string-parser": "^7.22.5", + "@babel/helper-validator-identifier": "^7.22.20", + "to-fast-properties": "^2.0.0" + } + }, + "@jridgewell/gen-mapping": { + "version": "0.3.3", + "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.3.tgz", + "integrity": "sha512-HLhSWOLRi875zjjMG/r+Nv0oCW8umGb0BgEhyX3dDX3egwZtB8PqLnjz3yedt8R5StBrzcg4aBpnh8UA9D1BoQ==", + "dev": true, + "requires": { + "@jridgewell/set-array": "^1.0.1", + "@jridgewell/sourcemap-codec": "^1.4.10", + "@jridgewell/trace-mapping": "^0.3.9" + } + }, "globals": { "version": "11.12.0", "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz", @@ -9550,6 +9055,13 @@ "integrity": "sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw==", "dev": true }, + "@colors/colors": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/@colors/colors/-/colors-1.5.0.tgz", + "integrity": "sha512-ooWCrlZP11i8GImSjTHYHLkvFDP48nS4+204nGb1RiX/WXYHmJA2III9/e2DWVabCESdW7hBAEzHRqUn9OUVvQ==", + "dev": true, + "optional": true + }, "@cspotcode/source-map-support": { "version": "0.8.1", "resolved": "https://registry.npmjs.org/@cspotcode/source-map-support/-/source-map-support-0.8.1.tgz", @@ -9588,6 +9100,12 @@ "strip-json-comments": "^3.1.1" } }, + "@faker-js/faker": { + "version": "5.5.3", + "resolved": "https://registry.npmjs.org/@faker-js/faker/-/faker-5.5.3.tgz", + "integrity": "sha512-R11tGE6yIFwqpaIqcfkcg7AICXzFg14+5h5v0TfF/9+RMDL6jhzCy/pxHVOfbALGdtVYdt6JdR21tuxEgl34dw==", + "dev": true + }, "@humanwhocodes/config-array": { "version": "0.10.4", "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.10.4.tgz", @@ -9684,45 +9202,6 @@ "jest-message-util": "^29.0.2", "jest-util": "^29.0.2", "slash": "^3.0.0" - }, - "dependencies": { - "@jest/schemas": { - "version": "29.0.0", - "resolved": "https://registry.npmjs.org/@jest/schemas/-/schemas-29.0.0.tgz", - "integrity": "sha512-3Ab5HgYIIAnS0HjqJHQYZS+zXc4tUmTmBH3z83ajI6afXp8X3ZtdLX+nXx+I7LNkJD7uN9LAVhgnjDgZa2z0kA==", - "dev": true, - "requires": { - "@sinclair/typebox": "^0.24.1" - } - }, - "@jest/types": { - "version": "29.0.2", - "resolved": "https://registry.npmjs.org/@jest/types/-/types-29.0.2.tgz", - "integrity": "sha512-5WNMesBLmlkt1+fVkoCjHa0X3i3q8zc4QLTDkdHgCa2gyPZc7rdlZBWgVLqwS1860ZW5xJuCDwAzqbGaXIr/ew==", - "dev": true, - "requires": { - "@jest/schemas": "^29.0.0", - "@types/istanbul-lib-coverage": "^2.0.0", - "@types/istanbul-reports": "^3.0.0", - "@types/node": "*", - "@types/yargs": "^17.0.8", - "chalk": "^4.0.0" - } - }, - "jest-util": { - "version": "29.0.2", - "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-29.0.2.tgz", - "integrity": "sha512-ozk8ruEEEACxqpz0hN9UOgtPZS0aN+NffwQduR5dVlhN+eN47vxurtvgZkYZYMpYrsmlAEx1XabkB3BnN0GfKQ==", - "dev": true, - "requires": { - "@jest/types": "^29.0.2", - "@types/node": "*", - "chalk": "^4.0.0", - "ci-info": "^3.2.0", - "graceful-fs": "^4.2.9", - "picomatch": "^2.2.3" - } - } } }, "@jest/core": { @@ -9761,15 +9240,6 @@ "strip-ansi": "^6.0.0" }, "dependencies": { - "@jest/schemas": { - "version": "29.0.0", - "resolved": "https://registry.npmjs.org/@jest/schemas/-/schemas-29.0.0.tgz", - "integrity": "sha512-3Ab5HgYIIAnS0HjqJHQYZS+zXc4tUmTmBH3z83ajI6afXp8X3ZtdLX+nXx+I7LNkJD7uN9LAVhgnjDgZa2z0kA==", - "dev": true, - "requires": { - "@sinclair/typebox": "^0.24.1" - } - }, "@jest/transform": { "version": "29.0.2", "resolved": "https://registry.npmjs.org/@jest/transform/-/transform-29.0.2.tgz", @@ -9793,20 +9263,6 @@ "write-file-atomic": "^4.0.1" } }, - "@jest/types": { - "version": "29.0.2", - "resolved": "https://registry.npmjs.org/@jest/types/-/types-29.0.2.tgz", - "integrity": "sha512-5WNMesBLmlkt1+fVkoCjHa0X3i3q8zc4QLTDkdHgCa2gyPZc7rdlZBWgVLqwS1860ZW5xJuCDwAzqbGaXIr/ew==", - "dev": true, - "requires": { - "@jest/schemas": "^29.0.0", - "@types/istanbul-lib-coverage": "^2.0.0", - "@types/istanbul-reports": "^3.0.0", - "@types/node": "*", - "@types/yargs": "^17.0.8", - "chalk": "^4.0.0" - } - }, "jest-haste-map": { "version": "29.0.2", "resolved": "https://registry.npmjs.org/jest-haste-map/-/jest-haste-map-29.0.2.tgz", @@ -9833,20 +9289,6 @@ "integrity": "sha512-BV7VW7Sy0fInHWN93MMPtlClweYv2qrSCwfeFWmpribGZtQPWNvRSq9XOVgOEjU1iBGRKXUZil0o2AH7Iy9Lug==", "dev": true }, - "jest-util": { - "version": "29.0.2", - "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-29.0.2.tgz", - "integrity": "sha512-ozk8ruEEEACxqpz0hN9UOgtPZS0aN+NffwQduR5dVlhN+eN47vxurtvgZkYZYMpYrsmlAEx1XabkB3BnN0GfKQ==", - "dev": true, - "requires": { - "@jest/types": "^29.0.2", - "@types/node": "*", - "chalk": "^4.0.0", - "ci-info": "^3.2.0", - "graceful-fs": "^4.2.9", - "picomatch": "^2.2.3" - } - }, "jest-worker": { "version": "29.0.2", "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-29.0.2.tgz", @@ -9879,31 +9321,6 @@ "@jest/types": "^29.0.2", "@types/node": "*", "jest-mock": "^29.0.2" - }, - "dependencies": { - "@jest/schemas": { - "version": "29.0.0", - "resolved": "https://registry.npmjs.org/@jest/schemas/-/schemas-29.0.0.tgz", - "integrity": "sha512-3Ab5HgYIIAnS0HjqJHQYZS+zXc4tUmTmBH3z83ajI6afXp8X3ZtdLX+nXx+I7LNkJD7uN9LAVhgnjDgZa2z0kA==", - "dev": true, - "requires": { - "@sinclair/typebox": "^0.24.1" - } - }, - "@jest/types": { - "version": "29.0.2", - "resolved": "https://registry.npmjs.org/@jest/types/-/types-29.0.2.tgz", - "integrity": "sha512-5WNMesBLmlkt1+fVkoCjHa0X3i3q8zc4QLTDkdHgCa2gyPZc7rdlZBWgVLqwS1860ZW5xJuCDwAzqbGaXIr/ew==", - "dev": true, - "requires": { - "@jest/schemas": "^29.0.0", - "@types/istanbul-lib-coverage": "^2.0.0", - "@types/istanbul-reports": "^3.0.0", - "@types/node": "*", - "@types/yargs": "^17.0.8", - "chalk": "^4.0.0" - } - } } }, "@jest/expect": { @@ -9937,45 +9354,6 @@ "jest-message-util": "^29.0.2", "jest-mock": "^29.0.2", "jest-util": "^29.0.2" - }, - "dependencies": { - "@jest/schemas": { - "version": "29.0.0", - "resolved": "https://registry.npmjs.org/@jest/schemas/-/schemas-29.0.0.tgz", - "integrity": "sha512-3Ab5HgYIIAnS0HjqJHQYZS+zXc4tUmTmBH3z83ajI6afXp8X3ZtdLX+nXx+I7LNkJD7uN9LAVhgnjDgZa2z0kA==", - "dev": true, - "requires": { - "@sinclair/typebox": "^0.24.1" - } - }, - "@jest/types": { - "version": "29.0.2", - "resolved": "https://registry.npmjs.org/@jest/types/-/types-29.0.2.tgz", - "integrity": "sha512-5WNMesBLmlkt1+fVkoCjHa0X3i3q8zc4QLTDkdHgCa2gyPZc7rdlZBWgVLqwS1860ZW5xJuCDwAzqbGaXIr/ew==", - "dev": true, - "requires": { - "@jest/schemas": "^29.0.0", - "@types/istanbul-lib-coverage": "^2.0.0", - "@types/istanbul-reports": "^3.0.0", - "@types/node": "*", - "@types/yargs": "^17.0.8", - "chalk": "^4.0.0" - } - }, - "jest-util": { - "version": "29.0.2", - "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-29.0.2.tgz", - "integrity": "sha512-ozk8ruEEEACxqpz0hN9UOgtPZS0aN+NffwQduR5dVlhN+eN47vxurtvgZkYZYMpYrsmlAEx1XabkB3BnN0GfKQ==", - "dev": true, - "requires": { - "@jest/types": "^29.0.2", - "@types/node": "*", - "chalk": "^4.0.0", - "ci-info": "^3.2.0", - "graceful-fs": "^4.2.9", - "picomatch": "^2.2.3" - } - } } }, "@jest/globals": { @@ -9988,31 +9366,6 @@ "@jest/expect": "^29.0.2", "@jest/types": "^29.0.2", "jest-mock": "^29.0.2" - }, - "dependencies": { - "@jest/schemas": { - "version": "29.0.0", - "resolved": "https://registry.npmjs.org/@jest/schemas/-/schemas-29.0.0.tgz", - "integrity": "sha512-3Ab5HgYIIAnS0HjqJHQYZS+zXc4tUmTmBH3z83ajI6afXp8X3ZtdLX+nXx+I7LNkJD7uN9LAVhgnjDgZa2z0kA==", - "dev": true, - "requires": { - "@sinclair/typebox": "^0.24.1" - } - }, - "@jest/types": { - "version": "29.0.2", - "resolved": "https://registry.npmjs.org/@jest/types/-/types-29.0.2.tgz", - "integrity": "sha512-5WNMesBLmlkt1+fVkoCjHa0X3i3q8zc4QLTDkdHgCa2gyPZc7rdlZBWgVLqwS1860ZW5xJuCDwAzqbGaXIr/ew==", - "dev": true, - "requires": { - "@jest/schemas": "^29.0.0", - "@types/istanbul-lib-coverage": "^2.0.0", - "@types/istanbul-reports": "^3.0.0", - "@types/node": "*", - "@types/yargs": "^17.0.8", - "chalk": "^4.0.0" - } - } } }, "@jest/reporters": { @@ -10048,15 +9401,6 @@ "v8-to-istanbul": "^9.0.1" }, "dependencies": { - "@jest/schemas": { - "version": "29.0.0", - "resolved": "https://registry.npmjs.org/@jest/schemas/-/schemas-29.0.0.tgz", - "integrity": "sha512-3Ab5HgYIIAnS0HjqJHQYZS+zXc4tUmTmBH3z83ajI6afXp8X3ZtdLX+nXx+I7LNkJD7uN9LAVhgnjDgZa2z0kA==", - "dev": true, - "requires": { - "@sinclair/typebox": "^0.24.1" - } - }, "@jest/transform": { "version": "29.0.2", "resolved": "https://registry.npmjs.org/@jest/transform/-/transform-29.0.2.tgz", @@ -10080,20 +9424,6 @@ "write-file-atomic": "^4.0.1" } }, - "@jest/types": { - "version": "29.0.2", - "resolved": "https://registry.npmjs.org/@jest/types/-/types-29.0.2.tgz", - "integrity": "sha512-5WNMesBLmlkt1+fVkoCjHa0X3i3q8zc4QLTDkdHgCa2gyPZc7rdlZBWgVLqwS1860ZW5xJuCDwAzqbGaXIr/ew==", - "dev": true, - "requires": { - "@jest/schemas": "^29.0.0", - "@types/istanbul-lib-coverage": "^2.0.0", - "@types/istanbul-reports": "^3.0.0", - "@types/node": "*", - "@types/yargs": "^17.0.8", - "chalk": "^4.0.0" - } - }, "jest-haste-map": { "version": "29.0.2", "resolved": "https://registry.npmjs.org/jest-haste-map/-/jest-haste-map-29.0.2.tgz", @@ -10120,20 +9450,6 @@ "integrity": "sha512-BV7VW7Sy0fInHWN93MMPtlClweYv2qrSCwfeFWmpribGZtQPWNvRSq9XOVgOEjU1iBGRKXUZil0o2AH7Iy9Lug==", "dev": true }, - "jest-util": { - "version": "29.0.2", - "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-29.0.2.tgz", - "integrity": "sha512-ozk8ruEEEACxqpz0hN9UOgtPZS0aN+NffwQduR5dVlhN+eN47vxurtvgZkYZYMpYrsmlAEx1XabkB3BnN0GfKQ==", - "dev": true, - "requires": { - "@jest/types": "^29.0.2", - "@types/node": "*", - "chalk": "^4.0.0", - "ci-info": "^3.2.0", - "graceful-fs": "^4.2.9", - "picomatch": "^2.2.3" - } - }, "jest-worker": { "version": "29.0.2", "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-29.0.2.tgz", @@ -10186,31 +9502,6 @@ "@jest/types": "^29.0.2", "@types/istanbul-lib-coverage": "^2.0.0", "collect-v8-coverage": "^1.0.0" - }, - "dependencies": { - "@jest/schemas": { - "version": "29.0.0", - "resolved": "https://registry.npmjs.org/@jest/schemas/-/schemas-29.0.0.tgz", - "integrity": "sha512-3Ab5HgYIIAnS0HjqJHQYZS+zXc4tUmTmBH3z83ajI6afXp8X3ZtdLX+nXx+I7LNkJD7uN9LAVhgnjDgZa2z0kA==", - "dev": true, - "requires": { - "@sinclair/typebox": "^0.24.1" - } - }, - "@jest/types": { - "version": "29.0.2", - "resolved": "https://registry.npmjs.org/@jest/types/-/types-29.0.2.tgz", - "integrity": "sha512-5WNMesBLmlkt1+fVkoCjHa0X3i3q8zc4QLTDkdHgCa2gyPZc7rdlZBWgVLqwS1860ZW5xJuCDwAzqbGaXIr/ew==", - "dev": true, - "requires": { - "@jest/schemas": "^29.0.0", - "@types/istanbul-lib-coverage": "^2.0.0", - "@types/istanbul-reports": "^3.0.0", - "@types/node": "*", - "@types/yargs": "^17.0.8", - "chalk": "^4.0.0" - } - } } }, "@jest/test-sequencer": { @@ -10225,29 +9516,6 @@ "slash": "^3.0.0" }, "dependencies": { - "@jest/schemas": { - "version": "29.0.0", - "resolved": "https://registry.npmjs.org/@jest/schemas/-/schemas-29.0.0.tgz", - "integrity": "sha512-3Ab5HgYIIAnS0HjqJHQYZS+zXc4tUmTmBH3z83ajI6afXp8X3ZtdLX+nXx+I7LNkJD7uN9LAVhgnjDgZa2z0kA==", - "dev": true, - "requires": { - "@sinclair/typebox": "^0.24.1" - } - }, - "@jest/types": { - "version": "29.0.2", - "resolved": "https://registry.npmjs.org/@jest/types/-/types-29.0.2.tgz", - "integrity": "sha512-5WNMesBLmlkt1+fVkoCjHa0X3i3q8zc4QLTDkdHgCa2gyPZc7rdlZBWgVLqwS1860ZW5xJuCDwAzqbGaXIr/ew==", - "dev": true, - "requires": { - "@jest/schemas": "^29.0.0", - "@types/istanbul-lib-coverage": "^2.0.0", - "@types/istanbul-reports": "^3.0.0", - "@types/node": "*", - "@types/yargs": "^17.0.8", - "chalk": "^4.0.0" - } - }, "jest-haste-map": { "version": "29.0.2", "resolved": "https://registry.npmjs.org/jest-haste-map/-/jest-haste-map-29.0.2.tgz", @@ -10274,20 +9542,6 @@ "integrity": "sha512-BV7VW7Sy0fInHWN93MMPtlClweYv2qrSCwfeFWmpribGZtQPWNvRSq9XOVgOEjU1iBGRKXUZil0o2AH7Iy9Lug==", "dev": true }, - "jest-util": { - "version": "29.0.2", - "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-29.0.2.tgz", - "integrity": "sha512-ozk8ruEEEACxqpz0hN9UOgtPZS0aN+NffwQduR5dVlhN+eN47vxurtvgZkYZYMpYrsmlAEx1XabkB3BnN0GfKQ==", - "dev": true, - "requires": { - "@jest/types": "^29.0.2", - "@types/node": "*", - "chalk": "^4.0.0", - "ci-info": "^3.2.0", - "graceful-fs": "^4.2.9", - "picomatch": "^2.2.3" - } - }, "jest-worker": { "version": "29.0.2", "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-29.0.2.tgz", @@ -10311,17 +9565,34 @@ } }, "@jest/types": { - "version": "28.1.3", - "resolved": "https://registry.npmjs.org/@jest/types/-/types-28.1.3.tgz", - "integrity": "sha512-RyjiyMUZrKz/c+zlMFO1pm70DcIlST8AeWTkoUdZevew44wcNZQHsEVOiCVtgVnlFFD82FPaXycys58cf2muVQ==", + "version": "29.6.1", + "resolved": "https://registry.npmmirror.com/@jest/types/-/types-29.6.1.tgz", + "integrity": "sha512-tPKQNMPuXgvdOn2/Lg9HNfUvjYVGolt04Hp03f5hAk878uwOLikN+JzeLY0HcVgKgFl9Hs3EIqpu3WX27XNhnw==", "dev": true, "requires": { - "@jest/schemas": "^28.1.3", + "@jest/schemas": "^29.6.0", "@types/istanbul-lib-coverage": "^2.0.0", "@types/istanbul-reports": "^3.0.0", "@types/node": "*", "@types/yargs": "^17.0.8", "chalk": "^4.0.0" + }, + "dependencies": { + "@jest/schemas": { + "version": "29.6.0", + "resolved": "https://registry.npmmirror.com/@jest/schemas/-/schemas-29.6.0.tgz", + "integrity": "sha512-rxLjXyJBTL4LQeJW3aKo0M/+GkCOXsO+8i9Iu7eDb6KwtP65ayoDsitrdPBtujxQ88k4wI2FNYfa6TOGwSn6cQ==", + "dev": true, + "requires": { + "@sinclair/typebox": "^0.27.8" + } + }, + "@sinclair/typebox": { + "version": "0.27.8", + "resolved": "https://registry.npmmirror.com/@sinclair/typebox/-/typebox-0.27.8.tgz", + "integrity": "sha512-+Fj43pSMwJs4KRrH/938Uf+uAELIgVBmQzg/q1YG10djyfA3TnrU8N8XzqCh/okZdszqBQTZf96idMfE5lnwTA==", + "dev": true + } } }, "@jridgewell/gen-mapping": { @@ -10335,9 +9606,9 @@ } }, "@jridgewell/resolve-uri": { - "version": "3.0.7", - "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.0.7.tgz", - "integrity": "sha512-8cXDaBBHOr2pQ7j77Y6Vp5VDT2sIqWyWQ56TjEq4ih/a4iST3dItRe8Q9fp0rrIl9DoKhWQtUQz/YpOxLkXbNA==", + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.1.tgz", + "integrity": "sha512-dSYZh7HhCDtCKm4QakX0xFpsRDqjjtZf/kjI/v3T3Nwt5r8/qz/M19F9ySyOqU94SXBmeG9ttTul+YnR4LOxFA==", "dev": true }, "@jridgewell/set-array": { @@ -10347,19 +9618,19 @@ "dev": true }, "@jridgewell/sourcemap-codec": { - "version": "1.4.13", - "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.13.tgz", - "integrity": "sha512-GryiOJmNcWbovBxTfZSF71V/mXbgcV3MewDe3kIMCLyIh5e7SKAeUZs+rMnJ8jkMolZ/4/VsdBmMrw3l+VdZ3w==", + "version": "1.4.15", + "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.15.tgz", + "integrity": "sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg==", "dev": true }, "@jridgewell/trace-mapping": { - "version": "0.3.15", - "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.15.tgz", - "integrity": "sha512-oWZNOULl+UbhsgB51uuZzglikfIKSUBO/M9W2OfEjn7cmqoAiCgmv9lyACTUacZwBz0ITnJ2NqjU8Tx0DHL88g==", + "version": "0.3.20", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.20.tgz", + "integrity": "sha512-R8LcPeWZol2zR8mmH3JeKQ6QRCFb7XgUhV9ZlGhHLGyg4wpPiPZNQOOWhFZhxKw8u//yTbNGI42Bx/3paXEQ+Q==", "dev": true, "requires": { - "@jridgewell/resolve-uri": "^3.0.3", - "@jridgewell/sourcemap-codec": "^1.4.10" + "@jridgewell/resolve-uri": "^3.1.0", + "@jridgewell/sourcemap-codec": "^1.4.14" } }, "@nodelib/fs.scandir": { @@ -10399,6 +9670,26 @@ "mime-types": "^2.1.12" } }, + "@postman/tough-cookie": { + "version": "4.1.3-postman.1", + "resolved": "https://registry.npmjs.org/@postman/tough-cookie/-/tough-cookie-4.1.3-postman.1.tgz", + "integrity": "sha512-txpgUqZOnWYnUHZpHjkfb0IwVH4qJmyq77pPnJLlfhMtdCLMFTEeQHlzQiK906aaNCe4NEB5fGJHo9uzGbFMeA==", + "dev": true, + "requires": { + "psl": "^1.1.33", + "punycode": "^2.1.1", + "universalify": "^0.2.0", + "url-parse": "^1.5.3" + }, + "dependencies": { + "universalify": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.2.0.tgz", + "integrity": "sha512-CJ1QgKmNg3CwvAv/kOFmtnEN05f0D/cn9QntgNOQlQF9dgvVTHj3t+8JPdjqawCHk7V/KA+fbUqzZ9XWhcqPUg==", + "dev": true + } + } + }, "@postman/tunnel-agent": { "version": "0.6.3", "resolved": "https://registry.npmjs.org/@postman/tunnel-agent/-/tunnel-agent-0.6.3.tgz", @@ -10569,9 +9860,9 @@ } }, "@types/jest": { - "version": "29.0.0", - "resolved": "https://registry.npmjs.org/@types/jest/-/jest-29.0.0.tgz", - "integrity": "sha512-X6Zjz3WO4cT39Gkl0lZ2baFRaEMqJl5NC1OjElkwtNzAlbkr2K/WJXkBkH5VP0zx4Hgsd2TZYdOEfvp2Dxia+Q==", + "version": "29.5.3", + "resolved": "https://registry.npmmirror.com/@types/jest/-/jest-29.5.3.tgz", + "integrity": "sha512-1Nq7YrO/vJE/FYnqYyw0FS8LdrjExSgIiHyKg7xPpn+yi8Q4huZryKnkJatN1ZRH89Kw2v33/8ZMB7DuZeSLlA==", "dev": true, "requires": { "expect": "^29.0.0", @@ -10672,17 +9963,6 @@ "regexpp": "^3.2.0", "semver": "^7.3.7", "tsutils": "^3.21.0" - }, - "dependencies": { - "semver": { - "version": "7.3.7", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.7.tgz", - "integrity": "sha512-QlYTucUYOews+WeEujDoEGziz4K6c47V/Bd+LjSSYcA94p+DmINdf7ncaUinThfvZyu13lN9OY1XDxt8C0Tw0g==", - "dev": true, - "requires": { - "lru-cache": "^6.0.0" - } - } } }, "@typescript-eslint/parser": { @@ -10738,17 +10018,6 @@ "is-glob": "^4.0.3", "semver": "^7.3.7", "tsutils": "^3.21.0" - }, - "dependencies": { - "semver": { - "version": "7.3.7", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.7.tgz", - "integrity": "sha512-QlYTucUYOews+WeEujDoEGziz4K6c47V/Bd+LjSSYcA94p+DmINdf7ncaUinThfvZyu13lN9OY1XDxt8C0Tw0g==", - "dev": true, - "requires": { - "lru-cache": "^6.0.0" - } - } } }, "@typescript-eslint/utils": { @@ -10794,7 +10063,8 @@ "version": "5.3.2", "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz", "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==", - "dev": true + "dev": true, + "requires": {} }, "acorn-walk": { "version": "8.2.0", @@ -10920,9 +10190,9 @@ "dev": true }, "async": { - "version": "3.2.3", - "resolved": "https://registry.npmjs.org/async/-/async-3.2.3.tgz", - "integrity": "sha512-spZRyzKL5l5BZQrr/6m/SqFdBN0q3OCI0f9rjfBzCMBIP4p75P620rR3gTmaksNOhmzgdxcaxdNfMy6anrbM0g==", + "version": "3.2.4", + "resolved": "https://registry.npmjs.org/async/-/async-3.2.4.tgz", + "integrity": "sha512-iAB+JbDEGXhyIUavoDl9WP/Jj106Kz9DEn1DPgYw5ruDn0e3Wgi3sKFm55sASdGBNOQB8F59d9qQ7deqrHA8wQ==", "dev": true }, "asynckit": { @@ -10944,9 +10214,9 @@ "dev": true }, "aws4": { - "version": "1.11.0", - "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.11.0.tgz", - "integrity": "sha512-xh1Rl34h6Fi1DC2WWKfxUTVqRsNnr6LsKz2+hfwDxQJWmrx8+c7ylaqBMcHfl1U1r2dsifOvKX3LQuLNZ+XSvA==", + "version": "1.12.0", + "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.12.0.tgz", + "integrity": "sha512-NmWvPnx0F1SfrQbYwOi7OeaNGokp9XhzNioJ/CSBs8Qa4vxug81mhJEAVZwxXuBmYB5KDRfMq/F3RR0BIU7sWg==", "dev": true }, "babel-plugin-istanbul": { @@ -11103,9 +10373,9 @@ } }, "brotli": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/brotli/-/brotli-1.3.2.tgz", - "integrity": "sha512-K0HNa0RRpUpcF8yS4yNSd6vmkrvA+wRd+symIcwhfqGLAi7YgGlKfO4oDYVgiahiLGNviO9uY7Zlb1MCPeTmSA==", + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/brotli/-/brotli-1.3.3.tgz", + "integrity": "sha512-oTKjJdShmDuGW94SyyaoQvAjf30dZaHnjJ8uAF+u2/vGJkJbJPJAT1gDiOJP5v1Zb6f9KEyW/1HpuaWIXtGHPg==", "dev": true, "requires": { "base64-js": "^1.1.2" @@ -11213,9 +10483,9 @@ "dev": true }, "chardet": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/chardet/-/chardet-1.4.0.tgz", - "integrity": "sha512-NpwMDdSIprbYx1CLnfbxEIarI0Z+s9MssEgggMNheGM+WD68yOhV7IEA/3r6tr0yTRgQD0HuZJDw32s99i6L+A==", + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/chardet/-/chardet-1.6.0.tgz", + "integrity": "sha512-+QOTw3otC4+FxdjK9RopGpNOglADbr4WPFi0SonkO99JbpkTPbMxmdm4NenhF5Zs+4gPXLI1+y2uazws5TMe8w==", "dev": true }, "charset": { @@ -11243,21 +10513,21 @@ "dev": true }, "cli-progress": { - "version": "3.10.0", - "resolved": "https://registry.npmjs.org/cli-progress/-/cli-progress-3.10.0.tgz", - "integrity": "sha512-kLORQrhYCAtUPLZxqsAt2YJGOvRdt34+O6jl5cQGb7iF3dM55FQZlTR+rQyIK9JUcO9bBMwZsTlND+3dmFU2Cw==", + "version": "3.12.0", + "resolved": "https://registry.npmjs.org/cli-progress/-/cli-progress-3.12.0.tgz", + "integrity": "sha512-tRkV3HJ1ASwm19THiiLIXLO7Im7wlTuKnvkYaTkyoAPefqjNg7W7DHKUlGRxy9vxDvbyCYQkQozvptuMkGCg8A==", "dev": true, "requires": { - "string-width": "^4.2.0" + "string-width": "^4.2.3" } }, "cli-table3": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/cli-table3/-/cli-table3-0.6.1.tgz", - "integrity": "sha512-w0q/enDHhPLq44ovMGdQeeDLvwxwavsJX7oQGYt/LrBlYsyaxyDnp6z3QzFut/6kLLKnlcUVJLrpB7KBfgG/RA==", + "version": "0.6.3", + "resolved": "https://registry.npmjs.org/cli-table3/-/cli-table3-0.6.3.tgz", + "integrity": "sha512-w5Jac5SykAeZJKntOxJCrm63Eg5/4dhMWIcuTbo9rpE+brgaSZo0RuNJZeOyMgsUdhDeojvgyQLmjI+K50ZGyg==", "dev": true, "requires": { - "colors": "1.4.0", + "@colors/colors": "1.5.0", "string-width": "^4.2.0" } }, @@ -11321,9 +10591,9 @@ } }, "commander": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/commander/-/commander-7.2.0.tgz", - "integrity": "sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw==", + "version": "11.0.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-11.0.0.tgz", + "integrity": "sha512-9HMlXtt/BNoYr8ooyjjNRdIilOTkVJXB+GhxMTtOKwk0R4j4lS4NpjuqmRxroBfnfTSHQIHQB7wryHhXarNjmQ==", "dev": true }, "concat-map": { @@ -11383,6 +10653,15 @@ "integrity": "sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==", "dev": true }, + "cors": { + "version": "2.8.5", + "resolved": "https://registry.npmjs.org/cors/-/cors-2.8.5.tgz", + "integrity": "sha512-KIHbLJqu73RGr/hnbrO9uBeixNGuvSQjul/jdFvS/KFSIH1hWVd1ng7zOHx+YrEfInLG7q4n6GHQ9cDtxv/P6g==", + "requires": { + "object-assign": "^4", + "vary": "^1" + } + }, "create-require": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/create-require/-/create-require-1.1.1.tgz", @@ -11473,6 +10752,16 @@ "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz", "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==" }, + "des.js": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/des.js/-/des.js-1.1.0.tgz", + "integrity": "sha512-r17GxjhUCjSRy8aiJpr8/UadFIzMzJGexI3Nmz4ADi9LYSFx4gTBp80+NaX/YsXWWLhpZ7v/v/ubEc/bCNfKwg==", + "dev": true, + "requires": { + "inherits": "^2.0.1", + "minimalistic-assert": "^1.0.0" + } + }, "destroy": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.2.0.tgz", @@ -11805,12 +11094,6 @@ "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", "integrity": "sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==" }, - "eventemitter3": { - "version": "4.0.7", - "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-4.0.7.tgz", - "integrity": "sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw==", - "dev": true - }, "execa": { "version": "5.1.1", "resolved": "https://registry.npmjs.org/execa/-/execa-5.1.1.tgz", @@ -11851,45 +11134,6 @@ "jest-matcher-utils": "^29.0.2", "jest-message-util": "^29.0.2", "jest-util": "^29.0.2" - }, - "dependencies": { - "@jest/schemas": { - "version": "29.0.0", - "resolved": "https://registry.npmjs.org/@jest/schemas/-/schemas-29.0.0.tgz", - "integrity": "sha512-3Ab5HgYIIAnS0HjqJHQYZS+zXc4tUmTmBH3z83ajI6afXp8X3ZtdLX+nXx+I7LNkJD7uN9LAVhgnjDgZa2z0kA==", - "dev": true, - "requires": { - "@sinclair/typebox": "^0.24.1" - } - }, - "@jest/types": { - "version": "29.0.2", - "resolved": "https://registry.npmjs.org/@jest/types/-/types-29.0.2.tgz", - "integrity": "sha512-5WNMesBLmlkt1+fVkoCjHa0X3i3q8zc4QLTDkdHgCa2gyPZc7rdlZBWgVLqwS1860ZW5xJuCDwAzqbGaXIr/ew==", - "dev": true, - "requires": { - "@jest/schemas": "^29.0.0", - "@types/istanbul-lib-coverage": "^2.0.0", - "@types/istanbul-reports": "^3.0.0", - "@types/node": "*", - "@types/yargs": "^17.0.8", - "chalk": "^4.0.0" - } - }, - "jest-util": { - "version": "29.0.2", - "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-29.0.2.tgz", - "integrity": "sha512-ozk8ruEEEACxqpz0hN9UOgtPZS0aN+NffwQduR5dVlhN+eN47vxurtvgZkYZYMpYrsmlAEx1XabkB3BnN0GfKQ==", - "dev": true, - "requires": { - "@jest/types": "^29.0.2", - "@types/node": "*", - "chalk": "^4.0.0", - "ci-info": "^3.2.0", - "graceful-fs": "^4.2.9", - "picomatch": "^2.2.3" - } - } } }, "express": { @@ -11970,12 +11214,6 @@ "integrity": "sha512-11Ndz7Nv+mvAC1j0ktTa7fAb0vLyGGX+rMHNBYQviQDGU0Hw7lhctJANqbPhu9nV9/izT/IntTgZ7Im/9LJs9g==", "dev": true }, - "faker": { - "version": "5.5.3", - "resolved": "https://registry.npmjs.org/faker/-/faker-5.5.3.tgz", - "integrity": "sha512-wLTv2a28wjUyWkbnX7u/ABZBkUkIF2fCd73V6P2oFqEGEktDfzWx4UxrSqtPRw0xPRAcjeAOIiJWqZm3pP4u3g==", - "dev": true - }, "fast-deep-equal": { "version": "3.1.3", "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", @@ -12052,9 +11290,9 @@ "dev": true }, "filesize": { - "version": "8.0.7", - "resolved": "https://registry.npmjs.org/filesize/-/filesize-8.0.7.tgz", - "integrity": "sha512-pjmC+bkIF8XI7fWaH8KxHcZL3DPybs1roSKP4rKDvy20tAWwIObE4+JIseG2byfGKhud5ZnM4YSGKBz7Sh0ndQ==", + "version": "10.0.12", + "resolved": "https://registry.npmjs.org/filesize/-/filesize-10.0.12.tgz", + "integrity": "sha512-6RS9gDchbn+qWmtV2uSjo5vmKizgfCQeb5jKmqx8HyzA3MoLqqyQxN+QcjkGBJt7FjJ9qFce67Auyya5rRRbpw==", "dev": true }, "fill-range": { @@ -12124,9 +11362,9 @@ } }, "flatted": { - "version": "3.2.5", - "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.2.5.tgz", - "integrity": "sha512-WIWGi2L3DyTUvUrwRKgGi9TwxQMUEqPOPQBVi71R96jZXJdFskXEmf54BoZaS1kknGODoIGASGEzBUYdyMCBJg==", + "version": "3.2.6", + "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.2.6.tgz", + "integrity": "sha512-0sQoMh9s0BYsm+12Huy/rkKxVu4R1+r96YX5cG44rHV0pQ6iC3Q+mkoMFaGWObMFYQxCVT+ssG1ksneA2MI9KQ==", "dev": true }, "forever-agent": { @@ -12358,13 +11596,13 @@ "dev": true }, "handlebars": { - "version": "4.7.7", - "resolved": "https://registry.npmjs.org/handlebars/-/handlebars-4.7.7.tgz", - "integrity": "sha512-aAcXm5OAfE/8IXkcZvCepKU3VzW1/39Fb5ZuqMtgI/hT8X2YgoMvBY5dLhq/cpOvw7Lk1nK/UF71aLG/ZnVYRA==", + "version": "4.7.8", + "resolved": "https://registry.npmjs.org/handlebars/-/handlebars-4.7.8.tgz", + "integrity": "sha512-vafaFqs8MZkRrSX7sFVUdo3ap/eNiLnb4IakshzvP56X5Nr1iGKAIqdX6tMlm6HcNRIkr6AxO5jFEoJzzpT8aQ==", "dev": true, "requires": { "minimist": "^1.2.5", - "neo-async": "^2.6.0", + "neo-async": "^2.6.2", "source-map": "^0.6.1", "uglify-js": "^3.1.4", "wordwrap": "^1.0.0" @@ -12447,19 +11685,21 @@ } }, "httpntlm": { - "version": "1.7.7", - "resolved": "https://registry.npmjs.org/httpntlm/-/httpntlm-1.7.7.tgz", - "integrity": "sha512-Pv2Rvrz8H0qv1Dne5mAdZ9JegG1uc6Vu5lwLflIY6s8RKHdZQbW39L4dYswSgqMDT0pkJILUTKjeyU0VPNRZjA==", + "version": "1.8.13", + "resolved": "https://registry.npmjs.org/httpntlm/-/httpntlm-1.8.13.tgz", + "integrity": "sha512-2F2FDPiWT4rewPzNMg3uPhNkP3NExENlUGADRUDPQvuftuUTGW98nLZtGemCIW3G40VhWZYgkIDcQFAwZ3mf2Q==", "dev": true, "requires": { + "des.js": "^1.0.1", "httpreq": ">=0.4.22", + "js-md4": "^0.3.2", "underscore": "~1.12.1" } }, "httpreq": { - "version": "0.5.2", - "resolved": "https://registry.npmjs.org/httpreq/-/httpreq-0.5.2.tgz", - "integrity": "sha512-2Jm+x9WkExDOeFRrdBCBSpLPT5SokTcRHkunV3pjKmX/cx6av8zQ0WtHUMDrYb6O4hBFzNU6sxJEypvRUVYKnw==", + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/httpreq/-/httpreq-1.1.1.tgz", + "integrity": "sha512-uhSZLPPD2VXXOSN8Cni3kIsoFHaU2pT/nySEU/fHr/ePbqHYr0jeiQRmUKLEirC09SFPsdMoA7LU7UXMd/w0Kw==", "dev": true }, "https-proxy-agent": { @@ -12555,12 +11795,6 @@ "p-is-promise": "^3.0.0" } }, - "ip-regex": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/ip-regex/-/ip-regex-2.1.0.tgz", - "integrity": "sha1-+ni/XS5pE8kRzp+BnuUUa7bYROk=", - "dev": true - }, "ipaddr.js": { "version": "1.9.1", "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz", @@ -12713,31 +11947,6 @@ "@jest/types": "^29.0.2", "import-local": "^3.0.2", "jest-cli": "^29.0.2" - }, - "dependencies": { - "@jest/schemas": { - "version": "29.0.0", - "resolved": "https://registry.npmjs.org/@jest/schemas/-/schemas-29.0.0.tgz", - "integrity": "sha512-3Ab5HgYIIAnS0HjqJHQYZS+zXc4tUmTmBH3z83ajI6afXp8X3ZtdLX+nXx+I7LNkJD7uN9LAVhgnjDgZa2z0kA==", - "dev": true, - "requires": { - "@sinclair/typebox": "^0.24.1" - } - }, - "@jest/types": { - "version": "29.0.2", - "resolved": "https://registry.npmjs.org/@jest/types/-/types-29.0.2.tgz", - "integrity": "sha512-5WNMesBLmlkt1+fVkoCjHa0X3i3q8zc4QLTDkdHgCa2gyPZc7rdlZBWgVLqwS1860ZW5xJuCDwAzqbGaXIr/ew==", - "dev": true, - "requires": { - "@jest/schemas": "^29.0.0", - "@types/istanbul-lib-coverage": "^2.0.0", - "@types/istanbul-reports": "^3.0.0", - "@types/node": "*", - "@types/yargs": "^17.0.8", - "chalk": "^4.0.0" - } - } } }, "jest-changed-files": { @@ -12788,43 +11997,6 @@ "stack-utils": "^2.0.3" }, "dependencies": { - "@jest/schemas": { - "version": "29.0.0", - "resolved": "https://registry.npmjs.org/@jest/schemas/-/schemas-29.0.0.tgz", - "integrity": "sha512-3Ab5HgYIIAnS0HjqJHQYZS+zXc4tUmTmBH3z83ajI6afXp8X3ZtdLX+nXx+I7LNkJD7uN9LAVhgnjDgZa2z0kA==", - "dev": true, - "requires": { - "@sinclair/typebox": "^0.24.1" - } - }, - "@jest/types": { - "version": "29.0.2", - "resolved": "https://registry.npmjs.org/@jest/types/-/types-29.0.2.tgz", - "integrity": "sha512-5WNMesBLmlkt1+fVkoCjHa0X3i3q8zc4QLTDkdHgCa2gyPZc7rdlZBWgVLqwS1860ZW5xJuCDwAzqbGaXIr/ew==", - "dev": true, - "requires": { - "@jest/schemas": "^29.0.0", - "@types/istanbul-lib-coverage": "^2.0.0", - "@types/istanbul-reports": "^3.0.0", - "@types/node": "*", - "@types/yargs": "^17.0.8", - "chalk": "^4.0.0" - } - }, - "jest-util": { - "version": "29.0.2", - "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-29.0.2.tgz", - "integrity": "sha512-ozk8ruEEEACxqpz0hN9UOgtPZS0aN+NffwQduR5dVlhN+eN47vxurtvgZkYZYMpYrsmlAEx1XabkB3BnN0GfKQ==", - "dev": true, - "requires": { - "@jest/types": "^29.0.2", - "@types/node": "*", - "chalk": "^4.0.0", - "ci-info": "^3.2.0", - "graceful-fs": "^4.2.9", - "picomatch": "^2.2.3" - } - }, "p-limit": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", @@ -12854,45 +12026,6 @@ "jest-validate": "^29.0.2", "prompts": "^2.0.1", "yargs": "^17.3.1" - }, - "dependencies": { - "@jest/schemas": { - "version": "29.0.0", - "resolved": "https://registry.npmjs.org/@jest/schemas/-/schemas-29.0.0.tgz", - "integrity": "sha512-3Ab5HgYIIAnS0HjqJHQYZS+zXc4tUmTmBH3z83ajI6afXp8X3ZtdLX+nXx+I7LNkJD7uN9LAVhgnjDgZa2z0kA==", - "dev": true, - "requires": { - "@sinclair/typebox": "^0.24.1" - } - }, - "@jest/types": { - "version": "29.0.2", - "resolved": "https://registry.npmjs.org/@jest/types/-/types-29.0.2.tgz", - "integrity": "sha512-5WNMesBLmlkt1+fVkoCjHa0X3i3q8zc4QLTDkdHgCa2gyPZc7rdlZBWgVLqwS1860ZW5xJuCDwAzqbGaXIr/ew==", - "dev": true, - "requires": { - "@jest/schemas": "^29.0.0", - "@types/istanbul-lib-coverage": "^2.0.0", - "@types/istanbul-reports": "^3.0.0", - "@types/node": "*", - "@types/yargs": "^17.0.8", - "chalk": "^4.0.0" - } - }, - "jest-util": { - "version": "29.0.2", - "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-29.0.2.tgz", - "integrity": "sha512-ozk8ruEEEACxqpz0hN9UOgtPZS0aN+NffwQduR5dVlhN+eN47vxurtvgZkYZYMpYrsmlAEx1XabkB3BnN0GfKQ==", - "dev": true, - "requires": { - "@jest/types": "^29.0.2", - "@types/node": "*", - "chalk": "^4.0.0", - "ci-info": "^3.2.0", - "graceful-fs": "^4.2.9", - "picomatch": "^2.2.3" - } - } } }, "jest-config": { @@ -12925,15 +12058,6 @@ "strip-json-comments": "^3.1.1" }, "dependencies": { - "@jest/schemas": { - "version": "29.0.0", - "resolved": "https://registry.npmjs.org/@jest/schemas/-/schemas-29.0.0.tgz", - "integrity": "sha512-3Ab5HgYIIAnS0HjqJHQYZS+zXc4tUmTmBH3z83ajI6afXp8X3ZtdLX+nXx+I7LNkJD7uN9LAVhgnjDgZa2z0kA==", - "dev": true, - "requires": { - "@sinclair/typebox": "^0.24.1" - } - }, "@jest/transform": { "version": "29.0.2", "resolved": "https://registry.npmjs.org/@jest/transform/-/transform-29.0.2.tgz", @@ -12957,20 +12081,6 @@ "write-file-atomic": "^4.0.1" } }, - "@jest/types": { - "version": "29.0.2", - "resolved": "https://registry.npmjs.org/@jest/types/-/types-29.0.2.tgz", - "integrity": "sha512-5WNMesBLmlkt1+fVkoCjHa0X3i3q8zc4QLTDkdHgCa2gyPZc7rdlZBWgVLqwS1860ZW5xJuCDwAzqbGaXIr/ew==", - "dev": true, - "requires": { - "@jest/schemas": "^29.0.0", - "@types/istanbul-lib-coverage": "^2.0.0", - "@types/istanbul-reports": "^3.0.0", - "@types/node": "*", - "@types/yargs": "^17.0.8", - "chalk": "^4.0.0" - } - }, "babel-jest": { "version": "29.0.2", "resolved": "https://registry.npmjs.org/babel-jest/-/babel-jest-29.0.2.tgz", @@ -13034,20 +12144,6 @@ "integrity": "sha512-BV7VW7Sy0fInHWN93MMPtlClweYv2qrSCwfeFWmpribGZtQPWNvRSq9XOVgOEjU1iBGRKXUZil0o2AH7Iy9Lug==", "dev": true }, - "jest-util": { - "version": "29.0.2", - "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-29.0.2.tgz", - "integrity": "sha512-ozk8ruEEEACxqpz0hN9UOgtPZS0aN+NffwQduR5dVlhN+eN47vxurtvgZkYZYMpYrsmlAEx1XabkB3BnN0GfKQ==", - "dev": true, - "requires": { - "@jest/types": "^29.0.2", - "@types/node": "*", - "chalk": "^4.0.0", - "ci-info": "^3.2.0", - "graceful-fs": "^4.2.9", - "picomatch": "^2.2.3" - } - }, "jest-worker": { "version": "29.0.2", "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-29.0.2.tgz", @@ -13102,45 +12198,6 @@ "jest-get-type": "^29.0.0", "jest-util": "^29.0.2", "pretty-format": "^29.0.2" - }, - "dependencies": { - "@jest/schemas": { - "version": "29.0.0", - "resolved": "https://registry.npmjs.org/@jest/schemas/-/schemas-29.0.0.tgz", - "integrity": "sha512-3Ab5HgYIIAnS0HjqJHQYZS+zXc4tUmTmBH3z83ajI6afXp8X3ZtdLX+nXx+I7LNkJD7uN9LAVhgnjDgZa2z0kA==", - "dev": true, - "requires": { - "@sinclair/typebox": "^0.24.1" - } - }, - "@jest/types": { - "version": "29.0.2", - "resolved": "https://registry.npmjs.org/@jest/types/-/types-29.0.2.tgz", - "integrity": "sha512-5WNMesBLmlkt1+fVkoCjHa0X3i3q8zc4QLTDkdHgCa2gyPZc7rdlZBWgVLqwS1860ZW5xJuCDwAzqbGaXIr/ew==", - "dev": true, - "requires": { - "@jest/schemas": "^29.0.0", - "@types/istanbul-lib-coverage": "^2.0.0", - "@types/istanbul-reports": "^3.0.0", - "@types/node": "*", - "@types/yargs": "^17.0.8", - "chalk": "^4.0.0" - } - }, - "jest-util": { - "version": "29.0.2", - "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-29.0.2.tgz", - "integrity": "sha512-ozk8ruEEEACxqpz0hN9UOgtPZS0aN+NffwQduR5dVlhN+eN47vxurtvgZkYZYMpYrsmlAEx1XabkB3BnN0GfKQ==", - "dev": true, - "requires": { - "@jest/types": "^29.0.2", - "@types/node": "*", - "chalk": "^4.0.0", - "ci-info": "^3.2.0", - "graceful-fs": "^4.2.9", - "picomatch": "^2.2.3" - } - } } }, "jest-environment-node": { @@ -13155,45 +12212,6 @@ "@types/node": "*", "jest-mock": "^29.0.2", "jest-util": "^29.0.2" - }, - "dependencies": { - "@jest/schemas": { - "version": "29.0.0", - "resolved": "https://registry.npmjs.org/@jest/schemas/-/schemas-29.0.0.tgz", - "integrity": "sha512-3Ab5HgYIIAnS0HjqJHQYZS+zXc4tUmTmBH3z83ajI6afXp8X3ZtdLX+nXx+I7LNkJD7uN9LAVhgnjDgZa2z0kA==", - "dev": true, - "requires": { - "@sinclair/typebox": "^0.24.1" - } - }, - "@jest/types": { - "version": "29.0.2", - "resolved": "https://registry.npmjs.org/@jest/types/-/types-29.0.2.tgz", - "integrity": "sha512-5WNMesBLmlkt1+fVkoCjHa0X3i3q8zc4QLTDkdHgCa2gyPZc7rdlZBWgVLqwS1860ZW5xJuCDwAzqbGaXIr/ew==", - "dev": true, - "requires": { - "@jest/schemas": "^29.0.0", - "@types/istanbul-lib-coverage": "^2.0.0", - "@types/istanbul-reports": "^3.0.0", - "@types/node": "*", - "@types/yargs": "^17.0.8", - "chalk": "^4.0.0" - } - }, - "jest-util": { - "version": "29.0.2", - "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-29.0.2.tgz", - "integrity": "sha512-ozk8ruEEEACxqpz0hN9UOgtPZS0aN+NffwQduR5dVlhN+eN47vxurtvgZkYZYMpYrsmlAEx1XabkB3BnN0GfKQ==", - "dev": true, - "requires": { - "@jest/types": "^29.0.2", - "@types/node": "*", - "chalk": "^4.0.0", - "ci-info": "^3.2.0", - "graceful-fs": "^4.2.9", - "picomatch": "^2.2.3" - } - } } }, "jest-get-type": { @@ -13239,31 +12257,6 @@ "pretty-format": "^29.0.2", "slash": "^3.0.0", "stack-utils": "^2.0.3" - }, - "dependencies": { - "@jest/schemas": { - "version": "29.0.0", - "resolved": "https://registry.npmjs.org/@jest/schemas/-/schemas-29.0.0.tgz", - "integrity": "sha512-3Ab5HgYIIAnS0HjqJHQYZS+zXc4tUmTmBH3z83ajI6afXp8X3ZtdLX+nXx+I7LNkJD7uN9LAVhgnjDgZa2z0kA==", - "dev": true, - "requires": { - "@sinclair/typebox": "^0.24.1" - } - }, - "@jest/types": { - "version": "29.0.2", - "resolved": "https://registry.npmjs.org/@jest/types/-/types-29.0.2.tgz", - "integrity": "sha512-5WNMesBLmlkt1+fVkoCjHa0X3i3q8zc4QLTDkdHgCa2gyPZc7rdlZBWgVLqwS1860ZW5xJuCDwAzqbGaXIr/ew==", - "dev": true, - "requires": { - "@jest/schemas": "^29.0.0", - "@types/istanbul-lib-coverage": "^2.0.0", - "@types/istanbul-reports": "^3.0.0", - "@types/node": "*", - "@types/yargs": "^17.0.8", - "chalk": "^4.0.0" - } - } } }, "jest-mock": { @@ -13274,38 +12267,14 @@ "requires": { "@jest/types": "^29.0.2", "@types/node": "*" - }, - "dependencies": { - "@jest/schemas": { - "version": "29.0.0", - "resolved": "https://registry.npmjs.org/@jest/schemas/-/schemas-29.0.0.tgz", - "integrity": "sha512-3Ab5HgYIIAnS0HjqJHQYZS+zXc4tUmTmBH3z83ajI6afXp8X3ZtdLX+nXx+I7LNkJD7uN9LAVhgnjDgZa2z0kA==", - "dev": true, - "requires": { - "@sinclair/typebox": "^0.24.1" - } - }, - "@jest/types": { - "version": "29.0.2", - "resolved": "https://registry.npmjs.org/@jest/types/-/types-29.0.2.tgz", - "integrity": "sha512-5WNMesBLmlkt1+fVkoCjHa0X3i3q8zc4QLTDkdHgCa2gyPZc7rdlZBWgVLqwS1860ZW5xJuCDwAzqbGaXIr/ew==", - "dev": true, - "requires": { - "@jest/schemas": "^29.0.0", - "@types/istanbul-lib-coverage": "^2.0.0", - "@types/istanbul-reports": "^3.0.0", - "@types/node": "*", - "@types/yargs": "^17.0.8", - "chalk": "^4.0.0" - } - } } }, "jest-pnp-resolver": { "version": "1.2.2", "resolved": "https://registry.npmjs.org/jest-pnp-resolver/-/jest-pnp-resolver-1.2.2.tgz", "integrity": "sha512-olV41bKSMm8BdnuMsewT4jqlZ8+3TCARAXjZGT9jcoSnrfUnRCqnMoF9XEeoWjbzObpqF9dRhHQj0Xb9QdF6/w==", - "dev": true + "dev": true, + "requires": {} }, "jest-resolve": { "version": "29.0.2", @@ -13324,29 +12293,6 @@ "slash": "^3.0.0" }, "dependencies": { - "@jest/schemas": { - "version": "29.0.0", - "resolved": "https://registry.npmjs.org/@jest/schemas/-/schemas-29.0.0.tgz", - "integrity": "sha512-3Ab5HgYIIAnS0HjqJHQYZS+zXc4tUmTmBH3z83ajI6afXp8X3ZtdLX+nXx+I7LNkJD7uN9LAVhgnjDgZa2z0kA==", - "dev": true, - "requires": { - "@sinclair/typebox": "^0.24.1" - } - }, - "@jest/types": { - "version": "29.0.2", - "resolved": "https://registry.npmjs.org/@jest/types/-/types-29.0.2.tgz", - "integrity": "sha512-5WNMesBLmlkt1+fVkoCjHa0X3i3q8zc4QLTDkdHgCa2gyPZc7rdlZBWgVLqwS1860ZW5xJuCDwAzqbGaXIr/ew==", - "dev": true, - "requires": { - "@jest/schemas": "^29.0.0", - "@types/istanbul-lib-coverage": "^2.0.0", - "@types/istanbul-reports": "^3.0.0", - "@types/node": "*", - "@types/yargs": "^17.0.8", - "chalk": "^4.0.0" - } - }, "jest-haste-map": { "version": "29.0.2", "resolved": "https://registry.npmjs.org/jest-haste-map/-/jest-haste-map-29.0.2.tgz", @@ -13373,20 +12319,6 @@ "integrity": "sha512-BV7VW7Sy0fInHWN93MMPtlClweYv2qrSCwfeFWmpribGZtQPWNvRSq9XOVgOEjU1iBGRKXUZil0o2AH7Iy9Lug==", "dev": true }, - "jest-util": { - "version": "29.0.2", - "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-29.0.2.tgz", - "integrity": "sha512-ozk8ruEEEACxqpz0hN9UOgtPZS0aN+NffwQduR5dVlhN+eN47vxurtvgZkYZYMpYrsmlAEx1XabkB3BnN0GfKQ==", - "dev": true, - "requires": { - "@jest/types": "^29.0.2", - "@types/node": "*", - "chalk": "^4.0.0", - "ci-info": "^3.2.0", - "graceful-fs": "^4.2.9", - "picomatch": "^2.2.3" - } - }, "jest-worker": { "version": "29.0.2", "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-29.0.2.tgz", @@ -13456,15 +12388,6 @@ "source-map-support": "0.5.13" }, "dependencies": { - "@jest/schemas": { - "version": "29.0.0", - "resolved": "https://registry.npmjs.org/@jest/schemas/-/schemas-29.0.0.tgz", - "integrity": "sha512-3Ab5HgYIIAnS0HjqJHQYZS+zXc4tUmTmBH3z83ajI6afXp8X3ZtdLX+nXx+I7LNkJD7uN9LAVhgnjDgZa2z0kA==", - "dev": true, - "requires": { - "@sinclair/typebox": "^0.24.1" - } - }, "@jest/transform": { "version": "29.0.2", "resolved": "https://registry.npmjs.org/@jest/transform/-/transform-29.0.2.tgz", @@ -13488,20 +12411,6 @@ "write-file-atomic": "^4.0.1" } }, - "@jest/types": { - "version": "29.0.2", - "resolved": "https://registry.npmjs.org/@jest/types/-/types-29.0.2.tgz", - "integrity": "sha512-5WNMesBLmlkt1+fVkoCjHa0X3i3q8zc4QLTDkdHgCa2gyPZc7rdlZBWgVLqwS1860ZW5xJuCDwAzqbGaXIr/ew==", - "dev": true, - "requires": { - "@jest/schemas": "^29.0.0", - "@types/istanbul-lib-coverage": "^2.0.0", - "@types/istanbul-reports": "^3.0.0", - "@types/node": "*", - "@types/yargs": "^17.0.8", - "chalk": "^4.0.0" - } - }, "jest-haste-map": { "version": "29.0.2", "resolved": "https://registry.npmjs.org/jest-haste-map/-/jest-haste-map-29.0.2.tgz", @@ -13528,20 +12437,6 @@ "integrity": "sha512-BV7VW7Sy0fInHWN93MMPtlClweYv2qrSCwfeFWmpribGZtQPWNvRSq9XOVgOEjU1iBGRKXUZil0o2AH7Iy9Lug==", "dev": true }, - "jest-util": { - "version": "29.0.2", - "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-29.0.2.tgz", - "integrity": "sha512-ozk8ruEEEACxqpz0hN9UOgtPZS0aN+NffwQduR5dVlhN+eN47vxurtvgZkYZYMpYrsmlAEx1XabkB3BnN0GfKQ==", - "dev": true, - "requires": { - "@jest/types": "^29.0.2", - "@types/node": "*", - "chalk": "^4.0.0", - "ci-info": "^3.2.0", - "graceful-fs": "^4.2.9", - "picomatch": "^2.2.3" - } - }, "jest-worker": { "version": "29.0.2", "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-29.0.2.tgz", @@ -13603,15 +12498,6 @@ "strip-bom": "^4.0.0" }, "dependencies": { - "@jest/schemas": { - "version": "29.0.0", - "resolved": "https://registry.npmjs.org/@jest/schemas/-/schemas-29.0.0.tgz", - "integrity": "sha512-3Ab5HgYIIAnS0HjqJHQYZS+zXc4tUmTmBH3z83ajI6afXp8X3ZtdLX+nXx+I7LNkJD7uN9LAVhgnjDgZa2z0kA==", - "dev": true, - "requires": { - "@sinclair/typebox": "^0.24.1" - } - }, "@jest/transform": { "version": "29.0.2", "resolved": "https://registry.npmjs.org/@jest/transform/-/transform-29.0.2.tgz", @@ -13635,20 +12521,6 @@ "write-file-atomic": "^4.0.1" } }, - "@jest/types": { - "version": "29.0.2", - "resolved": "https://registry.npmjs.org/@jest/types/-/types-29.0.2.tgz", - "integrity": "sha512-5WNMesBLmlkt1+fVkoCjHa0X3i3q8zc4QLTDkdHgCa2gyPZc7rdlZBWgVLqwS1860ZW5xJuCDwAzqbGaXIr/ew==", - "dev": true, - "requires": { - "@jest/schemas": "^29.0.0", - "@types/istanbul-lib-coverage": "^2.0.0", - "@types/istanbul-reports": "^3.0.0", - "@types/node": "*", - "@types/yargs": "^17.0.8", - "chalk": "^4.0.0" - } - }, "jest-haste-map": { "version": "29.0.2", "resolved": "https://registry.npmjs.org/jest-haste-map/-/jest-haste-map-29.0.2.tgz", @@ -13675,20 +12547,6 @@ "integrity": "sha512-BV7VW7Sy0fInHWN93MMPtlClweYv2qrSCwfeFWmpribGZtQPWNvRSq9XOVgOEjU1iBGRKXUZil0o2AH7Iy9Lug==", "dev": true }, - "jest-util": { - "version": "29.0.2", - "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-29.0.2.tgz", - "integrity": "sha512-ozk8ruEEEACxqpz0hN9UOgtPZS0aN+NffwQduR5dVlhN+eN47vxurtvgZkYZYMpYrsmlAEx1XabkB3BnN0GfKQ==", - "dev": true, - "requires": { - "@jest/types": "^29.0.2", - "@types/node": "*", - "chalk": "^4.0.0", - "ci-info": "^3.2.0", - "graceful-fs": "^4.2.9", - "picomatch": "^2.2.3" - } - }, "jest-worker": { "version": "29.0.2", "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-29.0.2.tgz", @@ -13743,15 +12601,6 @@ "semver": "^7.3.5" }, "dependencies": { - "@jest/schemas": { - "version": "29.0.0", - "resolved": "https://registry.npmjs.org/@jest/schemas/-/schemas-29.0.0.tgz", - "integrity": "sha512-3Ab5HgYIIAnS0HjqJHQYZS+zXc4tUmTmBH3z83ajI6afXp8X3ZtdLX+nXx+I7LNkJD7uN9LAVhgnjDgZa2z0kA==", - "dev": true, - "requires": { - "@sinclair/typebox": "^0.24.1" - } - }, "@jest/transform": { "version": "29.0.2", "resolved": "https://registry.npmjs.org/@jest/transform/-/transform-29.0.2.tgz", @@ -13775,20 +12624,6 @@ "write-file-atomic": "^4.0.1" } }, - "@jest/types": { - "version": "29.0.2", - "resolved": "https://registry.npmjs.org/@jest/types/-/types-29.0.2.tgz", - "integrity": "sha512-5WNMesBLmlkt1+fVkoCjHa0X3i3q8zc4QLTDkdHgCa2gyPZc7rdlZBWgVLqwS1860ZW5xJuCDwAzqbGaXIr/ew==", - "dev": true, - "requires": { - "@jest/schemas": "^29.0.0", - "@types/istanbul-lib-coverage": "^2.0.0", - "@types/istanbul-reports": "^3.0.0", - "@types/node": "*", - "@types/yargs": "^17.0.8", - "chalk": "^4.0.0" - } - }, "jest-haste-map": { "version": "29.0.2", "resolved": "https://registry.npmjs.org/jest-haste-map/-/jest-haste-map-29.0.2.tgz", @@ -13815,20 +12650,6 @@ "integrity": "sha512-BV7VW7Sy0fInHWN93MMPtlClweYv2qrSCwfeFWmpribGZtQPWNvRSq9XOVgOEjU1iBGRKXUZil0o2AH7Iy9Lug==", "dev": true }, - "jest-util": { - "version": "29.0.2", - "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-29.0.2.tgz", - "integrity": "sha512-ozk8ruEEEACxqpz0hN9UOgtPZS0aN+NffwQduR5dVlhN+eN47vxurtvgZkYZYMpYrsmlAEx1XabkB3BnN0GfKQ==", - "dev": true, - "requires": { - "@jest/types": "^29.0.2", - "@types/node": "*", - "chalk": "^4.0.0", - "ci-info": "^3.2.0", - "graceful-fs": "^4.2.9", - "picomatch": "^2.2.3" - } - }, "jest-worker": { "version": "29.0.2", "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-29.0.2.tgz", @@ -13852,12 +12673,12 @@ } }, "jest-util": { - "version": "28.1.1", - "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-28.1.1.tgz", - "integrity": "sha512-FktOu7ca1DZSyhPAxgxB6hfh2+9zMoJ7aEQA759Z6p45NuO8mWcqujH+UdHlCm/V6JTWwDztM2ITCzU1ijJAfw==", + "version": "29.6.2", + "resolved": "https://registry.npmmirror.com/jest-util/-/jest-util-29.6.2.tgz", + "integrity": "sha512-3eX1qb6L88lJNCFlEADKOkjpXJQyZRiavX1INZ4tRnrBVr2COd3RgcTLyUiEXMNBlDU/cgYq6taUS0fExrWW4w==", "dev": true, "requires": { - "@jest/types": "^28.1.1", + "@jest/types": "^29.6.1", "@types/node": "*", "chalk": "^4.0.0", "ci-info": "^3.2.0", @@ -13879,29 +12700,6 @@ "pretty-format": "^29.0.2" }, "dependencies": { - "@jest/schemas": { - "version": "29.0.0", - "resolved": "https://registry.npmjs.org/@jest/schemas/-/schemas-29.0.0.tgz", - "integrity": "sha512-3Ab5HgYIIAnS0HjqJHQYZS+zXc4tUmTmBH3z83ajI6afXp8X3ZtdLX+nXx+I7LNkJD7uN9LAVhgnjDgZa2z0kA==", - "dev": true, - "requires": { - "@sinclair/typebox": "^0.24.1" - } - }, - "@jest/types": { - "version": "29.0.2", - "resolved": "https://registry.npmjs.org/@jest/types/-/types-29.0.2.tgz", - "integrity": "sha512-5WNMesBLmlkt1+fVkoCjHa0X3i3q8zc4QLTDkdHgCa2gyPZc7rdlZBWgVLqwS1860ZW5xJuCDwAzqbGaXIr/ew==", - "dev": true, - "requires": { - "@jest/schemas": "^29.0.0", - "@types/istanbul-lib-coverage": "^2.0.0", - "@types/istanbul-reports": "^3.0.0", - "@types/node": "*", - "@types/yargs": "^17.0.8", - "chalk": "^4.0.0" - } - }, "camelcase": { "version": "6.3.0", "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.3.0.tgz", @@ -13924,45 +12722,6 @@ "emittery": "^0.10.2", "jest-util": "^29.0.2", "string-length": "^4.0.1" - }, - "dependencies": { - "@jest/schemas": { - "version": "29.0.0", - "resolved": "https://registry.npmjs.org/@jest/schemas/-/schemas-29.0.0.tgz", - "integrity": "sha512-3Ab5HgYIIAnS0HjqJHQYZS+zXc4tUmTmBH3z83ajI6afXp8X3ZtdLX+nXx+I7LNkJD7uN9LAVhgnjDgZa2z0kA==", - "dev": true, - "requires": { - "@sinclair/typebox": "^0.24.1" - } - }, - "@jest/types": { - "version": "29.0.2", - "resolved": "https://registry.npmjs.org/@jest/types/-/types-29.0.2.tgz", - "integrity": "sha512-5WNMesBLmlkt1+fVkoCjHa0X3i3q8zc4QLTDkdHgCa2gyPZc7rdlZBWgVLqwS1860ZW5xJuCDwAzqbGaXIr/ew==", - "dev": true, - "requires": { - "@jest/schemas": "^29.0.0", - "@types/istanbul-lib-coverage": "^2.0.0", - "@types/istanbul-reports": "^3.0.0", - "@types/node": "*", - "@types/yargs": "^17.0.8", - "chalk": "^4.0.0" - } - }, - "jest-util": { - "version": "29.0.2", - "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-29.0.2.tgz", - "integrity": "sha512-ozk8ruEEEACxqpz0hN9UOgtPZS0aN+NffwQduR5dVlhN+eN47vxurtvgZkYZYMpYrsmlAEx1XabkB3BnN0GfKQ==", - "dev": true, - "requires": { - "@jest/types": "^29.0.2", - "@types/node": "*", - "chalk": "^4.0.0", - "ci-info": "^3.2.0", - "graceful-fs": "^4.2.9", - "picomatch": "^2.2.3" - } - } } }, "jest-websocket-mock": { @@ -14019,6 +12778,18 @@ } } }, + "jose": { + "version": "4.14.4", + "resolved": "https://registry.npmjs.org/jose/-/jose-4.14.4.tgz", + "integrity": "sha512-j8GhLiKmUAh+dsFXlX1aJCbt5KMibuKb+d7j1JaOJG6s2UjX1PQlW+OKB/sD4a/5ZYF4RcmYmLSndOoU3Lt/3g==", + "dev": true + }, + "js-md4": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/js-md4/-/js-md4-0.3.2.tgz", + "integrity": "sha512-/GDnfQYsltsjRswQhN9fhv3EMw2sCpUdrdxyWDOUK7eyD++r3gRhzgiQgc/x4MAv2i1iuQ4lxO5mvqM3vj4bwA==", + "dev": true + }, "js-sha512": { "version": "0.8.0", "resolved": "https://registry.npmjs.org/js-sha512/-/js-sha512-0.8.0.tgz", @@ -14083,9 +12854,9 @@ "dev": true }, "json5": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.1.tgz", - "integrity": "sha512-1hqLFMSrGHRHxav9q9gNjJ5EXznIxGVO09xQRrwplcS8qs28pZ8s8hupZAmqDwZUmVZ2Qb2jnyPOWcDH8m8dlA==", + "version": "2.2.3", + "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz", + "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==", "dev": true }, "jsonfile": { @@ -14288,6 +13059,12 @@ "integrity": "sha512-wXqjST+SLt7R009ySCglWBCFpjUygmCIfD790/kVbiGmUgfYGuB14PiTd5DwVxSV4NcYHjzMkoj5LjQZwTQLEA==", "dev": true }, + "minimalistic-assert": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz", + "integrity": "sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A==", + "dev": true + }, "minimatch": { "version": "3.1.2", "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", @@ -14303,6 +13080,12 @@ "integrity": "sha512-Jsjnk4bw3YJqYzbdyBiNsPWHPfO++UGG749Cxs6peCu5Xg4nrena6OVxOYxrQTqww0Jmwt+Ref8rggumkTLz9Q==", "dev": true }, + "mkdirp": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-3.0.1.tgz", + "integrity": "sha512-+NsyUUAZDmo6YVHzL/stxSu3t9YS1iljliy3BSDrXJ/dkn1KYdmtZODGGjLcc9XLgVVpH4KshHB8XmZgMhaBXg==", + "dev": true + }, "mkdirp-classic": { "version": "0.5.3", "resolved": "https://registry.npmjs.org/mkdirp-classic/-/mkdirp-classic-0.5.3.tgz", @@ -14394,51 +13177,32 @@ "dev": true }, "newman": { - "version": "5.3.2", - "resolved": "https://registry.npmjs.org/newman/-/newman-5.3.2.tgz", - "integrity": "sha512-cWy8pV0iwvMOZLTw3hkAHcwo2ZA0GKkXm8oUMn1Ltii3ZI2nKpnrg9QGdIT0hGHChRkX6prY5e3Aar7uykMGNg==", + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/newman/-/newman-6.0.0.tgz", + "integrity": "sha512-QaANQC5b6ga348MezIVRI9ZmMs+cg3MdYIp0tSEauH2tmWOAR9+cghNsFJNjU9JPui3jJp1ALC7pQq6g3Jqpxw==", "dev": true, "requires": { - "async": "3.2.3", - "chardet": "1.4.0", - "cli-progress": "3.10.0", - "cli-table3": "0.6.1", + "@postman/tough-cookie": "4.1.3-postman.1", + "async": "3.2.4", + "chardet": "1.6.0", + "cli-progress": "3.12.0", + "cli-table3": "0.6.3", "colors": "1.4.0", - "commander": "7.2.0", + "commander": "11.0.0", "csv-parse": "4.16.3", - "eventemitter3": "4.0.7", - "filesize": "8.0.7", + "filesize": "10.0.12", + "liquid-json": "0.3.1", "lodash": "4.17.21", - "mkdirp": "1.0.4", - "postman-collection": "4.1.1", - "postman-collection-transformer": "4.1.6", - "postman-request": "2.88.1-postman.31", - "postman-runtime": "7.29.0", + "mkdirp": "3.0.1", + "postman-collection": "4.2.1", + "postman-collection-transformer": "4.1.7", + "postman-request": "2.88.1-postman.33", + "postman-runtime": "7.33.0", "pretty-ms": "7.0.1", - "semver": "7.3.5", + "semver": "7.5.4", "serialised-error": "1.1.3", - "tough-cookie": "3.0.1", - "word-wrap": "1.2.3", + "word-wrap": "1.2.5", "xmlbuilder": "15.1.1" - }, - "dependencies": { - "mkdirp": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", - "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==", - "dev": true - }, - "tough-cookie": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-3.0.1.tgz", - "integrity": "sha512-yQyJ0u4pZsv9D4clxO69OEjLWYw+jbgspjTue4lTQZLfV0c5l1VmK2y1JK8E9ahdpltPOaAThPcp5nKPUgSnsg==", - "dev": true, - "requires": { - "ip-regex": "^2.1.0", - "psl": "^1.1.28", - "punycode": "^2.1.1" - } - } } }, "node-abi": { @@ -14527,8 +13291,7 @@ "object-assign": { "version": "4.1.1", "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", - "integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==", - "dev": true + "integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==" }, "object-hash": { "version": "1.3.1", @@ -14778,21 +13541,21 @@ } }, "postman-collection": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/postman-collection/-/postman-collection-4.1.1.tgz", - "integrity": "sha512-ODpJtlf8r99DMcTU7gFmi/yvQYckFzcuE6zL/fWnyrFT34ugdCBFlX+DN7M+AnP6lmR822fv5s60H4DnL4+fAg==", + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/postman-collection/-/postman-collection-4.2.1.tgz", + "integrity": "sha512-DFLt3/yu8+ldtOTIzmBUctoupKJBOVK4NZO0t68K2lIir9smQg7OdQTBjOXYy+PDh7u0pSDvD66tm93eBHEPHA==", "dev": true, "requires": { - "faker": "5.5.3", + "@faker-js/faker": "5.5.3", "file-type": "3.9.0", "http-reasons": "0.1.0", "iconv-lite": "0.6.3", "liquid-json": "0.3.1", "lodash": "4.17.21", "mime-format": "2.0.1", - "mime-types": "2.1.34", + "mime-types": "2.1.35", "postman-url-encoder": "3.0.5", - "semver": "7.3.5", + "semver": "7.5.4", "uuid": "8.3.2" }, "dependencies": { @@ -14805,21 +13568,6 @@ "safer-buffer": ">= 2.1.2 < 3.0.0" } }, - "mime-db": { - "version": "1.51.0", - "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.51.0.tgz", - "integrity": "sha512-5y8A56jg7XVQx2mbv1lu49NR4dokRnhZYTtL+KGfaa27uq4pSTXkwQkFJl4pkRMyNFz/EtYDSkiiEHx3F7UN6g==", - "dev": true - }, - "mime-types": { - "version": "2.1.34", - "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.34.tgz", - "integrity": "sha512-6cP692WwGIs9XXdOO4++N+7qjqv0rqxxVvJ3VHPh/Sc9mVZcQP+ZGhkKiTvWMQRr2tbHkJP/Yn7Y0npb3ZBs4A==", - "dev": true, - "requires": { - "mime-db": "1.51.0" - } - }, "uuid": { "version": "8.3.2", "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz", @@ -14829,15 +13577,15 @@ } }, "postman-collection-transformer": { - "version": "4.1.6", - "resolved": "https://registry.npmjs.org/postman-collection-transformer/-/postman-collection-transformer-4.1.6.tgz", - "integrity": "sha512-xvdQb6sZoWcG9xZXUPSuxocjcd6WCZlINlGGiuHdSfxhgiwQhj9qhF0JRFbagZ8xB0+pYUairD5MiCENc6DEVA==", + "version": "4.1.7", + "resolved": "https://registry.npmjs.org/postman-collection-transformer/-/postman-collection-transformer-4.1.7.tgz", + "integrity": "sha512-SxJkm/LnlFZs2splUBnS4jQFicgBptghpm4voHtNnaum3Ad64E2MHLV4fJhv58dVUmFwdSwdQUN3m2q0iLecnQ==", "dev": true, "requires": { "commander": "8.3.0", "inherits": "2.0.4", "lodash": "4.17.21", - "semver": "7.3.5", + "semver": "7.5.4", "strip-json-comments": "3.1.1" }, "dependencies": { @@ -14850,16 +13598,17 @@ } }, "postman-request": { - "version": "2.88.1-postman.31", - "resolved": "https://registry.npmjs.org/postman-request/-/postman-request-2.88.1-postman.31.tgz", - "integrity": "sha512-OJbYqP7ItxQ84yHyuNpDywCZB0HYbpHJisMQ9lb1cSL3N5H3Td6a2+3l/a74UMd3u82BiGC5yQyYmdOIETP/nQ==", + "version": "2.88.1-postman.33", + "resolved": "https://registry.npmjs.org/postman-request/-/postman-request-2.88.1-postman.33.tgz", + "integrity": "sha512-uL9sCML4gPH6Z4hreDWbeinKU0p0Ke261nU7OvII95NU22HN6Dk7T/SaVPaj6T4TsQqGKIFw6/woLZnH7ugFNA==", "dev": true, "requires": { "@postman/form-data": "~3.1.1", + "@postman/tough-cookie": "~4.1.3-postman.1", "@postman/tunnel-agent": "^0.6.3", "aws-sign2": "~0.7.0", - "aws4": "^1.8.0", - "brotli": "~1.3.2", + "aws4": "^1.12.0", + "brotli": "^1.3.3", "caseless": "~0.12.0", "combined-stream": "~1.0.6", "extend": "~3.0.2", @@ -14869,14 +13618,13 @@ "is-typedarray": "~1.0.0", "isstream": "~0.1.2", "json-stringify-safe": "~5.0.1", - "mime-types": "~2.1.19", + "mime-types": "^2.1.35", "oauth-sign": "~0.9.0", "performance-now": "^2.1.0", - "qs": "~6.5.2", + "qs": "~6.5.3", "safe-buffer": "^5.1.2", "stream-length": "^1.0.2", - "tough-cookie": "~2.5.0", - "uuid": "^3.3.2" + "uuid": "^8.3.2" }, "dependencies": { "qs": { @@ -14886,61 +13634,65 @@ "dev": true }, "uuid": { - "version": "3.4.0", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.4.0.tgz", - "integrity": "sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A==", + "version": "8.3.2", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz", + "integrity": "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==", "dev": true } } }, "postman-runtime": { - "version": "7.29.0", - "resolved": "https://registry.npmjs.org/postman-runtime/-/postman-runtime-7.29.0.tgz", - "integrity": "sha512-eXxHREE/fUpohkGPRgBY1YccSGx9cyW3mtGiPyIE4zD5fYzasgBHqW6kbEND3Xrd3yf/uht/YI1H8O7J1+A1+w==", + "version": "7.33.0", + "resolved": "https://registry.npmjs.org/postman-runtime/-/postman-runtime-7.33.0.tgz", + "integrity": "sha512-cYCb+5Y12FwZU/T3gOj2SKiOz38pisVLc0tdppb+ZlG7iqn5aLgxghJwhjG62pZCV6uixKiQX1hNdLSk9a9Xtw==", "dev": true, "requires": { - "async": "3.2.3", - "aws4": "1.11.0", - "handlebars": "4.7.7", - "httpntlm": "1.7.7", + "@postman/tough-cookie": "4.1.3-postman.1", + "async": "3.2.4", + "aws4": "1.12.0", + "handlebars": "4.7.8", + "httpntlm": "1.8.13", + "jose": "4.14.4", "js-sha512": "0.8.0", "lodash": "4.17.21", - "mime-types": "2.1.34", + "mime-types": "2.1.35", "node-oauth1": "1.3.0", "performance-now": "2.1.0", - "postman-collection": "4.1.1", - "postman-request": "2.88.1-postman.31", - "postman-sandbox": "4.0.6", + "postman-collection": "4.2.0", + "postman-request": "2.88.1-postman.33", + "postman-sandbox": "4.2.7", "postman-url-encoder": "3.0.5", "serialised-error": "1.1.3", - "tough-cookie": "3.0.1", + "strip-json-comments": "3.1.1", "uuid": "8.3.2" }, "dependencies": { - "mime-db": { - "version": "1.51.0", - "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.51.0.tgz", - "integrity": "sha512-5y8A56jg7XVQx2mbv1lu49NR4dokRnhZYTtL+KGfaa27uq4pSTXkwQkFJl4pkRMyNFz/EtYDSkiiEHx3F7UN6g==", - "dev": true - }, - "mime-types": { - "version": "2.1.34", - "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.34.tgz", - "integrity": "sha512-6cP692WwGIs9XXdOO4++N+7qjqv0rqxxVvJ3VHPh/Sc9mVZcQP+ZGhkKiTvWMQRr2tbHkJP/Yn7Y0npb3ZBs4A==", + "iconv-lite": { + "version": "0.6.3", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz", + "integrity": "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==", "dev": true, "requires": { - "mime-db": "1.51.0" + "safer-buffer": ">= 2.1.2 < 3.0.0" } }, - "tough-cookie": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-3.0.1.tgz", - "integrity": "sha512-yQyJ0u4pZsv9D4clxO69OEjLWYw+jbgspjTue4lTQZLfV0c5l1VmK2y1JK8E9ahdpltPOaAThPcp5nKPUgSnsg==", + "postman-collection": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/postman-collection/-/postman-collection-4.2.0.tgz", + "integrity": "sha512-tvOLgN1h6Kab6dt43PmBoV5kYO/YUta3x0C2QqfmbzmHZe47VTpZ/+gIkGlbNhjKNPUUub5X6ehxYKoaTYdy1w==", "dev": true, "requires": { - "ip-regex": "^2.1.0", - "psl": "^1.1.28", - "punycode": "^2.1.1" + "@faker-js/faker": "5.5.3", + "file-type": "3.9.0", + "http-reasons": "0.1.0", + "iconv-lite": "0.6.3", + "liquid-json": "0.3.1", + "lodash": "4.17.21", + "mime-format": "2.0.1", + "mime-types": "2.1.35", + "postman-url-encoder": "3.0.5", + "semver": "7.5.4", + "uuid": "8.3.2" } }, "uuid": { @@ -14952,14 +13704,51 @@ } }, "postman-sandbox": { - "version": "4.0.6", - "resolved": "https://registry.npmjs.org/postman-sandbox/-/postman-sandbox-4.0.6.tgz", - "integrity": "sha512-PPRanSNEE4zy3kO7CeSBHmAfJnGdD9ecHY/Mjh26CQuZZarGkNO8c0U/n+xX3+5M1BRNc82UYq6YCtdsSDqcng==", + "version": "4.2.7", + "resolved": "https://registry.npmjs.org/postman-sandbox/-/postman-sandbox-4.2.7.tgz", + "integrity": "sha512-/EcCrKnb/o+9iLS4u+H76E0kBomJFjPptVjoDiq1uZ7Es/4aTv0MAX+0aoDxdDO+0h9sl8vy65uKQwyjN7AOaw==", "dev": true, "requires": { "lodash": "4.17.21", + "postman-collection": "4.2.0", "teleport-javascript": "1.0.0", - "uvm": "2.0.2" + "uvm": "2.1.1" + }, + "dependencies": { + "iconv-lite": { + "version": "0.6.3", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz", + "integrity": "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==", + "dev": true, + "requires": { + "safer-buffer": ">= 2.1.2 < 3.0.0" + } + }, + "postman-collection": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/postman-collection/-/postman-collection-4.2.0.tgz", + "integrity": "sha512-tvOLgN1h6Kab6dt43PmBoV5kYO/YUta3x0C2QqfmbzmHZe47VTpZ/+gIkGlbNhjKNPUUub5X6ehxYKoaTYdy1w==", + "dev": true, + "requires": { + "@faker-js/faker": "5.5.3", + "file-type": "3.9.0", + "http-reasons": "0.1.0", + "iconv-lite": "0.6.3", + "liquid-json": "0.3.1", + "lodash": "4.17.21", + "mime-format": "2.0.1", + "mime-types": "2.1.35", + "postman-url-encoder": "3.0.5", + "semver": "7.5.4", + "uuid": "8.3.2" + } + }, + "uuid": { + "version": "8.3.2", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz", + "integrity": "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==", + "dev": true + } } }, "postman-url-encoder": { @@ -15067,9 +13856,9 @@ } }, "psl": { - "version": "1.8.0", - "resolved": "https://registry.npmjs.org/psl/-/psl-1.8.0.tgz", - "integrity": "sha512-RIdOzyoavK+hA18OGGWDqUTsCLhtA7IcZ/6NCs4fFJaHBDab+pDDmDIByWFRQJq2Cd7r1OoQxBGKOaztq+hjIQ==", + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/psl/-/psl-1.9.0.tgz", + "integrity": "sha512-E/ZsdU4HLs/68gYzgGTkMicWTLPdAftJLfJFlLUAAKZGkStNU72sZjT66SnMDVOfOWY/YAoiD7Jxa9iHvngcag==", "dev": true }, "pump": { @@ -15096,6 +13885,12 @@ "side-channel": "^1.0.4" } }, + "querystringify": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/querystringify/-/querystringify-2.2.0.tgz", + "integrity": "sha512-FIqgj2EUvTa7R50u0rGsyTftzjYmv/a3hO345bZNrqabNqjtgiDMgmo4mkUjd+nzU5oF3dClKqFIPUKybUyqoQ==", + "dev": true + }, "queue-microtask": { "version": "1.2.3", "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", @@ -15171,6 +13966,12 @@ "integrity": "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==", "dev": true }, + "requires-port": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/requires-port/-/requires-port-1.0.0.tgz", + "integrity": "sha512-KigOCHcocU3XODJxsu8i/j8T9tzT4adHiecwORRQ0ZZFcp7ahwXuRU1m+yuO90C5ZUyGeGfocHDI14M3L3yDAQ==", + "dev": true + }, "resolve": { "version": "1.22.0", "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.0.tgz", @@ -15246,9 +14047,9 @@ "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==" }, "semver": { - "version": "7.3.5", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.5.tgz", - "integrity": "sha512-PoeGJYh8HK4BTO/a9Tf6ZG3veo/A7ZVsYrSA6J8ny9nb3B1VrpkuN+z9OE5wfE5p6H4LchYZsegiQgbJD94ZFQ==", + "version": "7.5.4", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz", + "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==", "dev": true, "requires": { "lru-cache": "^6.0.0" @@ -15428,9 +14229,9 @@ "dev": true }, "sshpk": { - "version": "1.17.0", - "resolved": "https://registry.npmjs.org/sshpk/-/sshpk-1.17.0.tgz", - "integrity": "sha512-/9HIEs1ZXGhSPE8X6Ccm7Nam1z8KcoCqPdI7ecm1N33EzAetWahvQWVqLZtaZQ+IDKX4IyA2o0gBzqIMkAagHQ==", + "version": "1.18.0", + "resolved": "https://registry.npmjs.org/sshpk/-/sshpk-1.18.0.tgz", + "integrity": "sha512-2p2KJZTSqQ/I3+HX42EpYOa2l3f8Erv8MWKsy2I9uf4wA7yFIkXRffYdsx86y6z4vHtV8u7g+pPlr8/4ouAxsQ==", "dev": true, "requires": { "asn1": "~0.2.3", @@ -15447,7 +14248,7 @@ "stack-trace": { "version": "0.0.9", "resolved": "https://registry.npmjs.org/stack-trace/-/stack-trace-0.0.9.tgz", - "integrity": "sha1-qPbq7KkGdMMz58Q5U/J1tFFRBpU=", + "integrity": "sha512-vjUc6sfgtgY0dxCdnc40mK6Oftjo9+2K8H/NG81TMhgL392FtiPA9tn9RLyTxXmTLPJPjF3VyzFp6bsWFLisMQ==", "dev": true }, "stack-utils": { @@ -15475,7 +14276,7 @@ "stream-length": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/stream-length/-/stream-length-1.0.2.tgz", - "integrity": "sha1-gnfzy+5JpNqrz9tOL0qbXp8snwA=", + "integrity": "sha512-aI+qKFiwoDV4rsXiS7WRoCt+v2RX1nUj17+KJC5r2gfh5xoSJIfP6Y3Do/HtvesFcTSWthIuJ3l1cvKQY/+nZg==", "dev": true, "requires": { "bluebird": "^2.6.2" @@ -15669,16 +14470,6 @@ "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.1.tgz", "integrity": "sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==" }, - "tough-cookie": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.5.0.tgz", - "integrity": "sha512-nlLsUzgm1kfLXSXfRZMc1KLAugd4hqJHDTvc2hDIwS3mZAfMEuMbc03SujMF+GEcpaX/qboeycw6iO8JwVv2+g==", - "dev": true, - "requires": { - "psl": "^1.1.28", - "punycode": "^2.1.1" - } - }, "tr46": { "version": "0.0.3", "resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz", @@ -15686,18 +14477,18 @@ "dev": true }, "ts-jest": { - "version": "28.0.8", - "resolved": "https://registry.npmjs.org/ts-jest/-/ts-jest-28.0.8.tgz", - "integrity": "sha512-5FaG0lXmRPzApix8oFG8RKjAz4ehtm8yMKOTy5HX3fY6W8kmvOrmcY0hKDElW52FJov+clhUbrKAqofnj4mXTg==", + "version": "29.1.1", + "resolved": "https://registry.npmmirror.com/ts-jest/-/ts-jest-29.1.1.tgz", + "integrity": "sha512-D6xjnnbP17cC85nliwGiL+tpoKN0StpgE0TeOjXQTU6MVCfsB4v7aW05CgQ/1OywGb0x/oy9hHFnN+sczTiRaA==", "dev": true, "requires": { "bs-logger": "0.x", "fast-json-stable-stringify": "2.x", - "jest-util": "^28.0.0", - "json5": "^2.2.1", + "jest-util": "^29.0.0", + "json5": "^2.2.3", "lodash.memoize": "4.x", "make-error": "1.x", - "semver": "7.x", + "semver": "^7.5.3", "yargs-parser": "^21.0.1" } }, @@ -15749,7 +14540,7 @@ "tweetnacl": { "version": "0.14.5", "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-0.14.5.tgz", - "integrity": "sha1-WuaBd/GS1EViadEIr6k/+HQ/T2Q=", + "integrity": "sha512-KXXFFdAbFXY4geFIwoyNK+f5Z1b7swfXABfL7HXCmoIWMKU3dmS26672A4EeQtDzLKy7SXmfBu51JolvEKwtGA==", "dev": true }, "type-check": { @@ -15789,9 +14580,9 @@ "dev": true }, "uglify-js": { - "version": "3.16.0", - "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-3.16.0.tgz", - "integrity": "sha512-FEikl6bR30n0T3amyBh3LoiBdqHRy/f4H80+My34HOesOKyHfOsxAPAxOoqC0JUnC1amnO0IwkYC3sko51caSw==", + "version": "3.17.4", + "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-3.17.4.tgz", + "integrity": "sha512-T9q82TJI9e/C1TAxYvfb16xO120tMVFZrGA3f9/P4424DNu6ypK103y0GPFVa17yotwSyZW5iYXgjYHkGrJW/g==", "dev": true, "optional": true }, @@ -15821,6 +14612,16 @@ "punycode": "^2.1.0" } }, + "url-parse": { + "version": "1.5.10", + "resolved": "https://registry.npmjs.org/url-parse/-/url-parse-1.5.10.tgz", + "integrity": "sha512-WypcfiRhfeUP9vvF0j6rw0J3hrWrw6iZv3+22h6iRMJ/8z1Tj6XfLP4DsUix5MhMPnXpiHDoKyoZ/bdCkwBCiQ==", + "dev": true, + "requires": { + "querystringify": "^2.1.1", + "requires-port": "^1.0.0" + } + }, "util-deprecate": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", @@ -15838,20 +14639,12 @@ "integrity": "sha512-MXcSTerfPa4uqyzStbRoTgt5XIe3x5+42+q1sDuy3R5MDk66URdLMOZe5aPX/SQd+kuYAh0FdP/pO28IkQyTeg==" }, "uvm": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/uvm/-/uvm-2.0.2.tgz", - "integrity": "sha512-Ra+aPiS5GXAbwXmyNExqdS42sTqmmx4XWEDF8uJlsTfOkKf9Rd9xNgav1Yckv4HfVEZg4iOFODWHFYuJ+9Fzfg==", + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/uvm/-/uvm-2.1.1.tgz", + "integrity": "sha512-BZ5w8adTpNNr+zczOBRpaX/hH8UPKAf7fmCnidrcsqt3bn8KT9bDIfuS7hgRU9RXgiN01su2pwysBONY6w8W5w==", "dev": true, "requires": { - "flatted": "3.1.1" - }, - "dependencies": { - "flatted": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.1.1.tgz", - "integrity": "sha512-zAoAQiudy+r5SvnSw3KJy5os/oRJYHzrzja/tBDqrZtNhUw8bt6y8OBzMWcjWr+8liV8Eb6yOhw8WZ7VFZ5ZzA==", - "dev": true - } + "flatted": "3.2.6" } }, "v8-compile-cache-lib": { @@ -15879,7 +14672,7 @@ "verror": { "version": "1.10.0", "resolved": "https://registry.npmjs.org/verror/-/verror-1.10.0.tgz", - "integrity": "sha1-OhBcoXBTr1XW4nDB+CiGguGNpAA=", + "integrity": "sha512-ZZKSmDAEFOijERBLkmYfJ+vmk3w+7hOLYDNkRCuRuMJGEmqYNCNLyBBFwWKVMhfwaEF3WOd0Zlw86U/WC/+nYw==", "dev": true, "requires": { "assert-plus": "^1.0.0", @@ -15939,15 +14732,15 @@ } }, "word-wrap": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.3.tgz", - "integrity": "sha512-Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ==", + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.5.tgz", + "integrity": "sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA==", "dev": true }, "wordwrap": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-1.0.0.tgz", - "integrity": "sha1-J1hIEIkUVqQXHI0CJkQa3pDLyus=", + "integrity": "sha512-gvVzJFlPycKc5dZN4yPkP8w7Dc37BtP1yczEneOb4uq34pXZcvrtRTmWV8W+Ume+XCxKgbjM+nevkyFPMybd4Q==", "dev": true }, "wrap-ansi": { @@ -15980,7 +14773,8 @@ "ws": { "version": "8.8.1", "resolved": "https://registry.npmjs.org/ws/-/ws-8.8.1.tgz", - "integrity": "sha512-bGy2JzvzkPowEJV++hF07hAD6niYSr0JzBNo/J29WsB57A2r7Wlc1UFcTR9IzrPvuNVO4B8LGqF8qcpsVOhJCA==" + "integrity": "sha512-bGy2JzvzkPowEJV++hF07hAD6niYSr0JzBNo/J29WsB57A2r7Wlc1UFcTR9IzrPvuNVO4B8LGqF8qcpsVOhJCA==", + "requires": {} }, "xmlbuilder": { "version": "15.1.1", diff --git a/WebApp/package.json b/WebApp/package.json index ee2733449..c76941efe 100644 --- a/WebApp/package.json +++ b/WebApp/package.json @@ -15,6 +15,7 @@ "@types/express": "^4.17.13", "@types/node": "^18.7.15", "@types/ws": "^8.5.3", + "cors": "^2.8.5", "debug": "~4.3.4", "express": "~4.18.1", "morgan": "^1.10.0", @@ -23,7 +24,7 @@ }, "devDependencies": { "@jest-mock/express": "^2.0.1", - "@types/jest": "^29.0.0", + "@types/jest": "^29.0.2", "@types/morgan": "^1.9.3", "@typescript-eslint/eslint-plugin": "^5.36.2", "@typescript-eslint/parser": "^5.36.2", @@ -32,9 +33,9 @@ "jest": "^29.0.2", "jest-websocket-mock": "^2.4.0", "mock-socket": "^9.1.5", - "newman": "^5.3.2", + "newman": "^6.0.0", "pkg": "^5.8.0", - "ts-jest": "^28.0.8", + "ts-jest": "^29.0.2", "ts-node": "^10.9.1", "typescript": "^4.8.2" }, @@ -43,7 +44,8 @@ }, "pkg": { "assets": [ - "client/public/**/*" + "client/public/**/*", + "client/src/**/*" ], "targets": [ "node10" diff --git a/WebApp/src/class/httphandler.ts b/WebApp/src/class/httphandler.ts index f5c63243d..4741913d5 100644 --- a/WebApp/src/class/httphandler.ts +++ b/WebApp/src/class/httphandler.ts @@ -68,11 +68,11 @@ function checkSessionId(req: Request, res: Response, next): void { res.sendStatus(404); return; } - lastRequestedTime[id] = Date.now(); + lastRequestedTime.set(id, Date.now()); next(); } -function _deleteConnection(sessionId:string, connectionId:string) { +function _deleteConnection(sessionId:string, connectionId:string, datetime:number) { clients.get(sessionId).delete(connectionId); if(isPrivate) { @@ -83,7 +83,7 @@ function _deleteConnection(sessionId:string, connectionId:string) { if (clients.has(otherSessionId)) { clients.get(otherSessionId).delete(connectionId); const array1 = disconnections.get(otherSessionId); - array1.push(new Disconnection(connectionId, Date.now())); + array1.push(new Disconnection(connectionId, datetime)); } } } @@ -91,7 +91,7 @@ function _deleteConnection(sessionId:string, connectionId:string) { disconnections.forEach((array, id) => { if (id == sessionId) return; - array.push(new Disconnection(connectionId, Date.now())); + array.push(new Disconnection(connectionId, datetime)); }); } @@ -101,12 +101,14 @@ function _deleteConnection(sessionId:string, connectionId:string) { candidates.get(sessionId).delete(connectionId); const array2 = disconnections.get(sessionId); - array2.push(new Disconnection(connectionId, Date.now())); + array2.push(new Disconnection(connectionId, datetime)); } function _deleteSession(sessionId: string) { - for(const connectionId of Array.from(clients.get(sessionId))) { - _deleteConnection(sessionId, connectionId); + if(clients.has(sessionId)) { + for(const connectionId of Array.from(clients.get(sessionId))) { + _deleteConnection(sessionId, connectionId, Date.now()); + } } offers.delete(sessionId); answers.delete(sessionId); @@ -115,37 +117,32 @@ function _deleteSession(sessionId: string) { disconnections.delete(sessionId); } -function _checkDeletedSession(sessionId: string): void { - const connectionIds = Array.from(clients.get(sessionId)); - for (const connectionId of connectionIds) { - const pair = connectionPair.get(connectionId); - if (pair == null) { +function _checkForTimedOutSessions(): void { + for (const sessionId of Array.from(clients.keys())) + { + if(!lastRequestedTime.has(sessionId)) continue; - } - const otherSessionId = sessionId === pair[0] ? pair[1] : pair[0]; - if(!lastRequestedTime.has(otherSessionId)) - continue; - if(lastRequestedTime[otherSessionId] > Date.now() - TimeoutRequestedTime) + if(lastRequestedTime.get(sessionId) > Date.now() - TimeoutRequestedTime) continue; - _deleteSession(otherSessionId); - console.log("deleted"); + _deleteSession(sessionId); + console.log(`deleted sessionId:${sessionId} by timeout.`); } } -function _getConnection(sessionId: string): string[] { - _checkDeletedSession(sessionId); +function _getConnection(sessionId: string): string[] { + _checkForTimedOutSessions(); return Array.from(clients.get(sessionId)); } function _getDisconnection(sessionId: string, fromTime: number): Disconnection[] { - _checkDeletedSession(sessionId); + _checkForTimedOutSessions(); let arrayDisconnections: Disconnection[] = []; if (disconnections.size != 0 && disconnections.has(sessionId)) { arrayDisconnections = disconnections.get(sessionId); } if (fromTime > 0) { - arrayDisconnections = arrayDisconnections.filter((v) => v.datetime > fromTime); + arrayDisconnections = arrayDisconnections.filter((v) => v.datetime >= fromTime); } return arrayDisconnections; } @@ -165,7 +162,7 @@ function _getOffer(sessionId: string, fromTime: number): [string, Offer][] { } if (fromTime > 0) { - arrayOffers = arrayOffers.filter((v) => v[1].datetime > fromTime); + arrayOffers = arrayOffers.filter((v) => v[1].datetime >= fromTime); } return arrayOffers; } @@ -178,7 +175,7 @@ function _getAnswer(sessionId: string, fromTime: number): [string, Answer][] { } if (fromTime > 0) { - arrayAnswers = arrayAnswers.filter((v) => v[1].datetime > fromTime); + arrayAnswers = arrayAnswers.filter((v) => v[1].datetime >= fromTime); } return arrayAnswers; } @@ -196,7 +193,7 @@ function _getCandidate(sessionId: string, fromTime: number): [string, Candidate] continue; } const arrayCandidates = candidates.get(otherSessionId).get(connectionId) - .filter((v) => v.datetime > fromTime); + .filter((v) => v.datetime >= fromTime); if (arrayCandidates.length === 0) { continue; } @@ -246,17 +243,18 @@ function getAll(req: Request, res: Response): void { const answers: [string, Answer][] = _getAnswer(sessionId, fromTime); const candidates: [string, Candidate][] = _getCandidate(sessionId, fromTime); const disconnections: Disconnection[] = _getDisconnection(sessionId, fromTime); + const datetime = lastRequestedTime.get(sessionId); let array: any[] = []; - array = array.concat(connections.map((v) => ({ connectionId: v, type: "connect", datetime: Date.now() }))); + array = array.concat(connections.map((v) => ({ connectionId: v, type: "connect", datetime: datetime }))); array = array.concat(offers.map((v) => ({ connectionId: v[0], sdp: v[1].sdp, polite: v[1].polite, type: "offer", datetime: v[1].datetime }))); array = array.concat(answers.map((v) => ({ connectionId: v[0], sdp: v[1].sdp, type: "answer", datetime: v[1].datetime }))); array = array.concat(candidates.map((v) => ({ connectionId: v[0], candidate: v[1].candidate, sdpMLineIndex: v[1].sdpMLineIndex, sdpMid: v[1].sdpMid, type: "candidate", datetime: v[1].datetime }))); array = array.concat(disconnections.map((v) => ({ connectionId: v.id, type: "disconnect", datetime: v.datetime }))); array.sort((a, b) => a.datetime - b.datetime); - res.json({ messages: array }); + res.json({ messages: array, datetime: datetime }); } function createSession(sessionId: string, res: Response): void; @@ -281,6 +279,8 @@ function deleteSession(req: Request, res: Response): void { function createConnection(req: Request, res: Response): void { const sessionId: string = req.header('session-id'); const { connectionId } = req.body; + const datetime = lastRequestedTime.get(sessionId); + if (connectionId == null) { res.status(400).send({ error: new Error(`connectionId is required`) }); return; @@ -308,14 +308,15 @@ function createConnection(req: Request, res: Response): void { const connectionIds = getOrCreateConnectionIds(sessionId); connectionIds.add(connectionId); - res.json({ connectionId: connectionId, polite: polite, type: "connect", datetime: Date.now() }); + res.json({ connectionId: connectionId, polite: polite, type: "connect", datetime: datetime }); } function deleteConnection(req: Request, res: Response): void { const sessionId: string = req.header('session-id'); const { connectionId } = req.body; + const datetime = lastRequestedTime.get(sessionId); - _deleteConnection(sessionId, connectionId); + _deleteConnection(sessionId, connectionId, datetime); res.json({ connectionId: connectionId }); } @@ -323,6 +324,7 @@ function deleteConnection(req: Request, res: Response): void { function postOffer(req: Request, res: Response): void { const sessionId: string = req.header('session-id'); const { connectionId } = req.body; + const datetime = lastRequestedTime.get(sessionId); let keySessionId = null; let polite = false; @@ -333,17 +335,21 @@ function postOffer(req: Request, res: Response): void { if (keySessionId != null) { polite = true; const map = offers.get(keySessionId); - map.set(connectionId, new Offer(req.body.sdp, Date.now(), polite)); + map.set(connectionId, new Offer(req.body.sdp, datetime, polite)); } } res.sendStatus(200); return; } - connectionPair.set(connectionId, [sessionId, null]); + if(!connectionPair.has(connectionId)) + { + connectionPair.set(connectionId, [sessionId, null]); + } + keySessionId = sessionId; const map = offers.get(keySessionId); - map.set(connectionId, new Offer(req.body.sdp, Date.now(), polite)); + map.set(connectionId, new Offer(req.body.sdp, datetime, polite)); res.sendStatus(200); } @@ -351,6 +357,7 @@ function postOffer(req: Request, res: Response): void { function postAnswer(req: Request, res: Response): void { const sessionId: string = req.header('session-id'); const { connectionId } = req.body; + const datetime = lastRequestedTime.get(sessionId); const connectionIds = getOrCreateConnectionIds(sessionId); connectionIds.add(connectionId); @@ -373,7 +380,7 @@ function postAnswer(req: Request, res: Response): void { } const map = answers.get(otherSessionId); - map.set(connectionId, new Answer(req.body.sdp, Date.now())); + map.set(connectionId, new Answer(req.body.sdp, datetime)); // update datetime for candidates const mapCandidates = candidates.get(otherSessionId); @@ -381,7 +388,7 @@ function postAnswer(req: Request, res: Response): void { const arrayCandidates = mapCandidates.get(connectionId); if (arrayCandidates) { for (const candidate of arrayCandidates) { - candidate.datetime = Date.now(); + candidate.datetime = datetime; } } } @@ -391,13 +398,14 @@ function postAnswer(req: Request, res: Response): void { function postCandidate(req: Request, res: Response): void { const sessionId: string = req.header('session-id'); const { connectionId } = req.body; + const datetime = lastRequestedTime.get(sessionId); const map = candidates.get(sessionId); if (!map.has(connectionId)) { map.set(connectionId, []); } const arr = map.get(connectionId); - const candidate = new Candidate(req.body.candidate, req.body.sdpMLineIndex, req.body.sdpMid, Date.now()); + const candidate = new Candidate(req.body.candidate, req.body.sdpMLineIndex, req.body.sdpMid, datetime); arr.push(candidate); res.sendStatus(200); } diff --git a/WebApp/src/class/options.ts b/WebApp/src/class/options.ts index 329f1f29e..664836623 100644 --- a/WebApp/src/class/options.ts +++ b/WebApp/src/class/options.ts @@ -3,7 +3,7 @@ export default interface Options { port?: number; keyfile?: string; certfile?: string; - websocket?: boolean; + type?: string; mode?: string; logging?: string; -} \ No newline at end of file +} diff --git a/WebApp/src/index.ts b/WebApp/src/index.ts index 08f79b3eb..0bd49e752 100644 --- a/WebApp/src/index.ts +++ b/WebApp/src/index.ts @@ -16,13 +16,13 @@ export class RenderStreaming { if (Array.isArray(argv)) { program .usage('[options] ') - .option('-p, --port ', 'Port to start the server on', process.env.PORT || `80`) - .option('-s, --secure', 'Enable HTTPS (you need server.key and server.cert)', process.env.SECURE || false) - .option('-k, --keyfile ', 'https key file (default server.key)', process.env.KEYFILE || 'server.key') - .option('-c, --certfile ', 'https cert file (default server.cert)', process.env.CERTFILE || 'server.cert') - .option('-w, --websocket', 'Enable Websocket Signaling', process.env.WEBSOCKET || false) - .option('-m, --mode ', 'Choose Communication mode public or private (default public)', process.env.MODE || 'public') - .option('-l, --logging ', 'Choose http logging type combined, dev, short, tiny or none.(default dev)', process.env.LOGGING || 'dev') + .option('-p, --port ', 'Port to start the server on.', process.env.PORT || `80`) + .option('-s, --secure', 'Enable HTTPS (you need server.key and server.cert).', process.env.SECURE || false) + .option('-k, --keyfile ', 'https key file.', process.env.KEYFILE || 'server.key') + .option('-c, --certfile ', 'https cert file.', process.env.CERTFILE || 'server.cert') + .option('-t, --type ', 'Type of signaling protocol, Choose websocket or http.', process.env.TYPE || 'websocket') + .option('-m, --mode ', 'Choose Communication mode public or private.', process.env.MODE || 'public') + .option('-l, --logging ', 'Choose http logging type combined, dev, short, tiny or none.', process.env.LOGGING || 'dev') .parse(argv); const option = program.opts(); return { @@ -30,7 +30,7 @@ export class RenderStreaming { secure: option.secure == undefined ? false : option.secure, keyfile: option.keyfile, certfile: option.certfile, - websocket: option.websocket == undefined ? false : option.websocket, + type: option.type == undefined ? 'websocket' : option.type, mode: option.mode, logging: option.logging, }; @@ -69,9 +69,17 @@ export class RenderStreaming { } }); } + if (this.options.type == 'http') { + console.log(`Use http polling for signaling server.`); + } + else if(this.options.type != 'websocket') { + console.log(`signaling type should be set "websocket" or "http". ${this.options.type} is not supported.`); + console.log(`Changing signaling type to websocket.`); + this.options.type = 'websocket'; + } + if (this.options.type == 'websocket') { + console.log(`Use websocket for signaling server ws://${this.getIPAddress()[0]}`); - if (this.options.websocket) { - console.log(`start websocket signaling server ws://${this.getIPAddress()[0]}`); //Start Websocket Signaling server new WSSignaling(this.server, this.options.mode); } @@ -94,4 +102,4 @@ export class RenderStreaming { } } -RenderStreaming.run(process.argv); \ No newline at end of file +RenderStreaming.run(process.argv); diff --git a/WebApp/src/server.ts b/WebApp/src/server.ts index 5bf8eebff..224433aa9 100644 --- a/WebApp/src/server.ts +++ b/WebApp/src/server.ts @@ -7,6 +7,8 @@ import { log, LogLevel } from './log'; import Options from './class/options'; import { reset as resetHandler }from './class/httphandler'; +const cors = require('cors'); + export const createServer = (config: Options): express.Application => { const app: express.Application = express(); resetHandler(config.mode); @@ -15,9 +17,10 @@ export const createServer = (config: Options): express.Application => { app.use(morgan(config.logging)); } // const signal = require('./signaling'); + app.use(cors({origin: '*'})); app.use(express.urlencoded({ extended: true })); app.use(express.json()); - app.get('/config', (req, res) => res.json({ useWebSocket: config.websocket, startupMode: config.mode, logging: config.logging })); + app.get('/config', (req, res) => res.json({ useWebSocket: config.type == 'websocket', startupMode: config.mode, logging: config.logging })); app.use('/signaling', signaling); app.use(express.static(path.join(__dirname, '../client/public'))); app.use('/module', express.static(path.join(__dirname, '../client/src'))); diff --git a/WebApp/test/httphandler.test.ts b/WebApp/test/httphandler.test.ts index db58f9952..615eb31e4 100644 --- a/WebApp/test/httphandler.test.ts +++ b/WebApp/test/httphandler.test.ts @@ -1,9 +1,12 @@ import { getMockReq, getMockRes } from '@jest-mock/express'; import * as httpHandler from '../src/class/httphandler'; +const RetriesToForceTimeout = 11; // Waits a second each time, timeout is 10 sec for httphandler. + describe('http signaling test in public mode', () => { const sessionId = "abcd1234"; const sessionId2 = "abcd5678"; + const sessionId3 = "abcd9101112"; const connectionId = "12345"; const connectionId2 = "67890"; const testsdp = "test sdp"; @@ -11,6 +14,7 @@ describe('http signaling test in public mode', () => { const { res, next, mockClear } = getMockRes(); const req = getMockReq({ header: jest.fn(() => sessionId) }); const req2 = getMockReq({ header: jest.fn(() => sessionId2) }); + const req3 = getMockReq({ header: jest.fn(() => sessionId3) }); beforeAll(() => { httpHandler.reset("public"); @@ -18,6 +22,8 @@ describe('http signaling test in public mode', () => { beforeEach(() => { mockClear(); + httpHandler.checkSessionId(req, res, next); + httpHandler.checkSessionId(req2, res, next); }); test('throw check has session', async () => { @@ -59,7 +65,7 @@ describe('http signaling test in public mode', () => { test('get all from session1', async () => { await httpHandler.getAll(req, res); const connect = { connectionId: connectionId, datetime: expect.anything(), type: "connect" }; - expect(res.json).toHaveBeenCalledWith({ messages: expect.arrayContaining([connect]) }); + expect(res.json).toHaveBeenCalledWith({ messages: expect.arrayContaining([connect]), datetime: expect.anything() }); }); test('post offer from session1', async () => { @@ -123,7 +129,7 @@ describe('http signaling test in public mode', () => { test('disconnection get from session1', async () => { await httpHandler.getAll(req, res); const disconnect = { connectionId: connectionId, datetime: expect.anything(), type: "disconnect" }; - expect(res.json).toHaveBeenCalledWith({ messages: expect.arrayContaining([disconnect]) }); + expect(res.json).toHaveBeenCalledWith({ messages: expect.arrayContaining([disconnect]), datetime: expect.anything() }); }); test('delete connection from session1', async () => { @@ -152,7 +158,7 @@ describe('http signaling test in public mode', () => { await httpHandler.createSession(sessionId2, res); await httpHandler.getAll(req, res); - expect(res.json).toHaveBeenLastCalledWith({ messages: [] }); + expect(res.json).toHaveBeenLastCalledWith({ messages: [], datetime: expect.anything() }); const connectBody = { connectionId: connectionId }; req.body = connectBody; @@ -164,9 +170,9 @@ describe('http signaling test in public mode', () => { const offer = { connectionId: connectionId, sdp: testsdp, datetime: expect.anything(), type: "offer", polite: false }; await httpHandler.getAll(req, res); - expect(res.json).toHaveBeenLastCalledWith({ messages: expect.not.arrayContaining([offer]) }); + expect(res.json).toHaveBeenLastCalledWith({ messages: expect.not.arrayContaining([offer]), datetime: expect.anything() }); await httpHandler.getAll(req2, res); - expect(res.json).toHaveBeenLastCalledWith({ messages: expect.arrayContaining([offer]) }); + expect(res.json).toHaveBeenLastCalledWith({ messages: expect.arrayContaining([offer]), datetime: expect.anything() }); const deleteBody = { connectionId: connectionId }; req2.body = deleteBody; @@ -180,10 +186,127 @@ describe('http signaling test in public mode', () => { const disconnect = { connectionId: connectionId, type: "disconnect", datetime: expect.anything() }; await httpHandler.getAll(req2, res); - expect(res.json).toHaveBeenLastCalledWith({ messages: expect.arrayContaining([disconnect]) }); + expect(res.json).toHaveBeenLastCalledWith({ messages: expect.arrayContaining([disconnect]), datetime: expect.anything() }); await httpHandler.deleteSession(req2, res); }); + + test('Timed out session2 deleted after session1 resends offer', async () => { + httpHandler.reset("public"); + + await httpHandler.createSession(sessionId, res); + await httpHandler.createSession(sessionId2, res); + + req.url = ""; + req2.url = ""; + await httpHandler.checkSessionId(req, res, next); + await httpHandler.checkSessionId(req2, res, next); + + await httpHandler.getAll(req, res); + expect(res.json).toHaveBeenLastCalledWith({ messages: [], datetime: expect.anything() }); + + const connectBody = { connectionId: connectionId }; + req.body = connectBody; + await httpHandler.createConnection(req, res); + + const offerBody = { connectionId: connectionId, sdp: testsdp, datetime: expect.anything(), type: "offer" }; + req.body = offerBody; + await httpHandler.postOffer(req, res); + + const offer = { connectionId: connectionId, sdp: testsdp, datetime: expect.anything(), type: "offer", polite: false }; + await httpHandler.getAll(req, res); + expect(res.json).toHaveBeenLastCalledWith({ messages: expect.not.arrayContaining([offer]), datetime: expect.anything() }); + await httpHandler.getAll(req2, res); + expect(res.json).toHaveBeenLastCalledWith({ messages: expect.arrayContaining([offer]), datetime: expect.anything() }); + + const answerBody = { connectionId: connectionId, sdp: testsdp }; + req2.body = answerBody; + await httpHandler.postAnswer(req2, res); + + // resend offer after answer to simulate PeerCandidate entering into failed state + req.body = offerBody; + await httpHandler.postOffer(req, res); + + // Wait a second and then checkSession for only session1 to force timeout of session2. + for (let i = 0; i < RetriesToForceTimeout + 1; ++i) + { + await httpHandler.checkSessionId(req, res, next); + await new Promise(resolve => setTimeout(resolve, 1000)); + } + + // Get all for session1 to trigger cleaning up associated session that timed out. + await httpHandler.getAll(req, res); + + // Check that we do have session1 still + await httpHandler.checkSessionId(req, res, next); + expect(res.sendStatus).toHaveBeenLastCalledWith(200); + + // Check that we no longer have session2 + await httpHandler.checkSessionId(req2, res, next); + expect(res.sendStatus).toHaveBeenLastCalledWith(404); + + await httpHandler.deleteSession(req, res); + }, 16000); + +test('Timed out sessions are deleted when other sessions check', async () => { + httpHandler.reset("public"); + + await httpHandler.createSession(sessionId, res); + await httpHandler.createSession(sessionId2, res); + await httpHandler.createSession(sessionId3, res); + + req.url = ""; + req2.url = ""; + req3.url = ""; + await httpHandler.checkSessionId(req, res, next); + await httpHandler.checkSessionId(req2, res, next); + await httpHandler.checkSessionId(req3, res, next); + + await httpHandler.getAll(req, res); + expect(res.json).toHaveBeenLastCalledWith({ messages: [], datetime: expect.anything() }); + + const connectBody = { connectionId: connectionId }; + req.body = connectBody; + await httpHandler.createConnection(req, res); + + const offerBody = { connectionId: connectionId, sdp: testsdp, datetime: expect.anything(), type: "offer" }; + req.body = offerBody; + await httpHandler.postOffer(req, res); + + const offer = { connectionId: connectionId, sdp: testsdp, datetime: expect.anything(), type: "offer", polite: false }; + await httpHandler.getAll(req, res); + expect(res.json).toHaveBeenLastCalledWith({ messages: expect.not.arrayContaining([offer]), datetime: expect.anything() }); + await httpHandler.getAll(req2, res); + expect(res.json).toHaveBeenLastCalledWith({ messages: expect.arrayContaining([offer]), datetime: expect.anything() }); + + const answerBody = { connectionId: connectionId, sdp: testsdp }; + req2.body = answerBody; + await httpHandler.postAnswer(req2, res); + + // Wait a second and then checkSession for only session3 to force timeout of session1 & session2. + for (let i = 0; i < RetriesToForceTimeout + 1; ++i) + { + await httpHandler.checkSessionId(req3, res, next); + await new Promise(resolve => setTimeout(resolve, 1000)); + } + + // Get all for session3 to trigger cleaning up sessions that timed out. + await httpHandler.getAll(req3, res); + + // Check that we do have session3 still + await httpHandler.checkSessionId(req3, res, next); + expect(res.sendStatus).toHaveBeenLastCalledWith(200); + + // Check that we do have session1 still + await httpHandler.checkSessionId(req, res, next); + expect(res.sendStatus).toHaveBeenLastCalledWith(404); + + // Check that we no longer have session2 + await httpHandler.checkSessionId(req2, res, next); + expect(res.sendStatus).toHaveBeenLastCalledWith(404); + + await httpHandler.deleteSession(req3, res); +}, 16000); }); describe('http signaling test in private mode', () => { @@ -202,6 +325,9 @@ describe('http signaling test in private mode', () => { beforeEach(() => { mockClear(); + + httpHandler.checkSessionId(req, res, next); + httpHandler.checkSessionId(req2, res, next); }); test('throw check has session', async () => { @@ -346,7 +472,7 @@ describe('http signaling test in private mode', () => { await httpHandler.createSession(sessionId2, res); await httpHandler.getAll(req, res); - expect(res.json).toHaveBeenLastCalledWith({ messages: [] }); + expect(res.json).toHaveBeenLastCalledWith({ messages: [], datetime: expect.anything() }); const connectBody = { connectionId: connectionId }; req.body = connectBody; @@ -360,9 +486,9 @@ describe('http signaling test in private mode', () => { const offer = { connectionId: connectionId, sdp: testsdp, datetime: expect.anything(), type: "offer", polite: true }; await httpHandler.getAll(req, res); - expect(res.json).toHaveBeenLastCalledWith({ messages: expect.not.arrayContaining([offer]) }); + expect(res.json).toHaveBeenLastCalledWith({ messages: expect.not.arrayContaining([offer]), datetime: expect.anything() }); await httpHandler.getAll(req2, res); - expect(res.json).toHaveBeenLastCalledWith({ messages: expect.arrayContaining([offer]) }); + expect(res.json).toHaveBeenLastCalledWith({ messages: expect.arrayContaining([offer]), datetime: expect.anything() }); const deleteBody = { connectionId: connectionId }; req2.body = deleteBody; @@ -376,7 +502,7 @@ describe('http signaling test in private mode', () => { const disconnect = { connectionId: connectionId, type: "disconnect", datetime: expect.anything() }; await httpHandler.getAll(req2, res); - expect(res.json).toHaveBeenLastCalledWith({ messages: expect.arrayContaining([disconnect]) }); + expect(res.json).toHaveBeenLastCalledWith({ messages: expect.arrayContaining([disconnect]), datetime: expect.anything() }); await httpHandler.deleteSession(req2, res); }); diff --git a/WebApp/test/renderstreaming.postman_collection.json b/WebApp/test/renderstreaming.postman_collection.json index 158e2c9c5..96287cbad 100644 --- a/WebApp/test/renderstreaming.postman_collection.json +++ b/WebApp/test/renderstreaming.postman_collection.json @@ -860,6 +860,7 @@ "pm.test(\"The response has a valid JSON body\", function () {", " pm.response.to.be.json;", " pm.response.to.have.jsonBody(\"messages\");", + " pm.response.to.have.jsonBody(\"datetime\");", " var jsonData = pm.response.json();", " console.log(jsonData);", " pm.expect(jsonData.messages.length).to.be.above(0);", diff --git a/com.unity.renderstreaming/CHANGELOG.md b/com.unity.renderstreaming/CHANGELOG.md index a69847bd6..67678c977 100644 --- a/com.unity.renderstreaming/CHANGELOG.md +++ b/com.unity.renderstreaming/CHANGELOG.md @@ -4,6 +4,74 @@ All notable changes to com.unity.renderstreaming package will be documented in t The format is based on [Keep a Changelog](http://keepachangelog.com/en/1.0.0/) and this project adheres to [Semantic Versioning](http://semver.org/spec/v2.0.0.html). +## [3.1.0-exp.9] - 2024-12-13 + +### Changed +- deps: use com.unity.webrtc@3.0.0-pre.8 +- doc: improve the API documentation of VideoCodecInfo +- doc: improve the API documentation of AudioCodecInfo +- doc: improve the API documentation of VideoStreamSender +- doc: improve the API documentation of VideoStreamReceiver +- doc: improve the API documentation of InputSender +- doc: improve the API documentation of InputReceiver +- doc: improve the API documentation of AudioStreamSender +- doc: improve the API documentation of AudioStreamReceiver +- doc: improve the API documentation of SignalingManager + +## [3.1.0-exp.8] - 2023-11-30 + +### Changed + +- Upgrade the version of WebRTC package `3.0.0-pre.7`. + +## [3.1.0-exp.7] - 2023-08-09 + +### Added + +- Added configurable logger to enable users to customize logging for their environment. + +### Changed + +- Upgrade the version of WebRTC package `3.0.0-pre.6`. +- Add `AudioStreamSender.loopback` property. + +### Fixed + +- Fixed error on HTTP signaling when using short polling interval. +- Fixed `SignalingManager` so that ICE server configurations aren't effected. +- Added a workaround to fix an issue where `InputField` wasn't worked when entering characters from browsers or a `Receiver` scene of package sample. + +### Removed + +- Removed Furioos Integration. + +## [3.1.0-exp.6] - 2023-02-24 + +### Added + +- Support Automatic Streaming. +- Support Render Streaming Wizard. +- Support Command line arguments. +- Add Render Streaming Settings in the Project Settings window. + +### Changed + +- Rename classes. + - `RenderStreaming` > `SignalingManager` +- Websocket is in default for signaling protocol instead of HTTP polling. +- Changed a unit of the HTTP polling interval, second to millisecond. + +## [3.1.0-exp.5] - 2023-01-16 + +### Changed + +- Upgrade the version of Input System package `1.4.4`. +- Upgrade the version of WebRTC package `3.0.0-pre.4`. + +### Fixed + +- Fix incorrect mouse position in full-screen web player sample. + ## [3.1.0-exp.4] - 2022-10-06 ### Added diff --git a/com.unity.renderstreaming/Documentation~/TableOfContents.md b/com.unity.renderstreaming/Documentation~/TableOfContents.md index a0964dad0..471a941c7 100644 --- a/com.unity.renderstreaming/Documentation~/TableOfContents.md +++ b/com.unity.renderstreaming/Documentation~/TableOfContents.md @@ -1,10 +1,11 @@ * [About Unity Render Streaming](index.md) * [Overview](overview.md) +* [Tutorial](tutorial.md) * [Developing a streaming application](dev-streaming-app-intro.md) - * [Installing The Package](installation.md) - * [Launching The Web Application](launch-webapp.md) * [Creating The Scene](create-scene.md) * [Setting Up Device Input](control-camera.md) +* [Render Streaming Settings](settings.md) +* [Render Streaming Wizard](wizard.md) * [Web Application](webapp.md) * [Configure Self-Signed Credentials for https](https.md) * [Setting for TURN Server](turnserver.md) @@ -15,8 +16,7 @@ * [Video Streaming Component](video-streaming.md) * [Audio Streaming Component](audio-streaming.md) * [Data Streaming Component](data-streaming.md) -* [Using with Input System](use-inputsystem.md) -* [Deploy to Furioos](deploy-to-furioos.md) +* [Command-line option](commandline-option.md) * [Samples](samples.md) * [Receiver](sample-receiver.md) * [Broadcast](sample-broadcast.md) @@ -26,5 +26,4 @@ * [Gyroscope](sample-gyroscope.md) * [Web Browser Input](sample-browserinput.md) * [Multiplay](sample-multiplay.md) -* [Project Template](template.md) * [FAQ](faq.md) diff --git a/com.unity.renderstreaming/Documentation~/audio-streaming.md b/com.unity.renderstreaming/Documentation~/audio-streaming.md index 4f44dd657..e71077d63 100644 --- a/com.unity.renderstreaming/Documentation~/audio-streaming.md +++ b/com.unity.renderstreaming/Documentation~/audio-streaming.md @@ -15,9 +15,10 @@ This component streams the audio rendering results from [`AudioListener`](https: | **Audio Source Type** | Choose the type of source for your audio streaming.
- *Audio Listener*
- *Audio Source*
- *Microphone* | *Audio Listener* | | *Audio Listener* | [`Audio Listener`](https://docs.unity3d.com/ScriptReference/AudioSource.html) instance for sending audio | | | *Audio Source* | [`Audio Source`](https://docs.unity3d.com/ScriptReference/AudioSource.html) instance for sending audio | | -| *Microphone Device Index* | The index of the video input device to be used. See [Microphone.devices](https://docs.unity3d.com/ScriptReference/Microphone-devices.html). | 0 | +| *Microphone Device Index* | The index of the microphone input device to be used. See [Microphone.devices](https://docs.unity3d.com/ScriptReference/Microphone-devices.html). | 0 | | *Auto Request User Authorization* | Whether request permission to use microphone. You don't need to enable it if you call [Application.RequestUserAuthorization](https://docs.unity3d.com/ScriptReference/Application.RequestUserAuthorization.html) yourself. | Enabled | | **Audio Codec** | *Default* option means trying to use all available codecs for negotiating other peers. | Default | +| *Loopback* | The sending audio is also played on sender side. | Disabled | | **Bitrate (kbits/sec)** | The bitrate of the audio streaming. | | | *Min* | The minimum value of the bitrate. | 0 | | *Max* | The maximum value of the bitrate. | 1000 | diff --git a/com.unity.renderstreaming/Documentation~/commandline-option.md b/com.unity.renderstreaming/Documentation~/commandline-option.md new file mode 100644 index 000000000..62ee99542 --- /dev/null +++ b/com.unity.renderstreaming/Documentation~/commandline-option.md @@ -0,0 +1,73 @@ +# Command line arguments + +Unity Render Streaming supports configuration changes via command line arguments. you can change settings to match the deployment environments. Command line arguments work with Windows, macOS, and Linux runtime applications. Mobile platforms aren't supported. + +> [!WARNING] +> **-batchmode** and **-nographics** options don't work with Unity Render Streaming. + +Command line arguments are evaluated when initializing the [**SignalingManager**](streaming-management.md) component. When command line arguments are evaluated in the **SignalingManager** component, it overrides the settings specified in the [Settings Window](settings.md). If you wish to ignore the command line options, specify **Evaluate command line arguments** off in the SignalingManager inspector. If a command line arguments contain invalid values, the contents of the configuration window are evaluated, instead of the arguments of the command line. + +Use a command line with the following arguments to start your standalone app. + +| Argument | Description | +| --- | --- | +| `signalingType ` | Specify the signaling type. **websocket** or **http**. | +| `signalingUrl ` | Specify the URL of signaling server. | +| `iceServerUrl ` | Set the URL of STUN/TURN server. | +| `iceServerUsername ` | Specify the user name of the TURN server. | +| `iceServerCredential ` | Specify the password of the TURN server. | +| `iceServerCredentialType ` | Specify the credential type for the TURN server. **password** or **oauth**. | +| `pollingInterval ` | Specify the polling interval in milliseconds to the signaling server. This value is used when using **http** for the signaling type. | +| `importJson ` | Specify the path of the JSON file. | + +## Import JSON + +You can change the configuration via the JSON file when using **-importJson** option in command line. The JSON file must be written in the following format: + +```javascript +{ + "signalingType": "websocket", + "signalingUrl": "ws://192.168.11.11", + "iceServers": [{ + "urls": [ + "stun:stun.l.google.com:19302" + ], + "username": "user", + "credential": "pass", + "credentialType": "password" + }], + "pollingInterval": "5000" +} +``` + +## Command line examples + +Change the signaling type to **http**: + +``` +RenderStreaming.exe -signalingType http +``` + +Change the URL of the signaling server: + +``` +RenderStreaming.exe -signalingUrl http://192.168.10.1 +``` + +Specify multiple URLs of STAN servers: + +``` +RenderStreaming.exe -iceServerUrl stun:stun.l.google.com:19302 -iceServerUrl stun:stun.l.google.com:19303 +``` + +Specify the URL, username, and password of the TURN server: + +``` +RenderStreaming.exe -iceServerUrl turn:192.168.10.10:3478?transport=udp -iceServerUsername username -iceServerCredentialType password -iceServerCredential pass +``` + +Specify the path of the JSON file: + +``` +RenderStreaming.exe -importJson config.json +``` diff --git a/com.unity.renderstreaming/Documentation~/control-camera.md b/com.unity.renderstreaming/Documentation~/control-camera.md index c577907b6..8b158b0ac 100644 --- a/com.unity.renderstreaming/Documentation~/control-camera.md +++ b/com.unity.renderstreaming/Documentation~/control-camera.md @@ -4,7 +4,7 @@ To control the camera on the remote PC, we need to link the input events on web ## Check settings of Input System -First, please check [the settings](use-inputsystem.md) for using Input System. +First, please check the [Wizard window](wizard.md) about the Input System settings. ## Adding components for input processing @@ -84,8 +84,8 @@ Once you have copied the script and saved the file, assign `PlayerController.Loo ## Checking on browsers -The mouse operation in the browser should be reflected in the rotation of the camera. If the camera is not moved, please check [the settings](use-inputsystem.md). +The mouse operation in the browser should be reflected in the rotation of the camera. If the camera is not moved, please check the settings on the [Wizard](wizard.md) window. ## Next step -We were able to incorporate the input processing using the Input Actions feature. If you would like to learn more about the features of Unity Render Streaming, please see the [Sample page](samples.md). Also, check out [Customizing your web application](customize-webapp.md) for information on how to modify the web user interface. \ No newline at end of file +We were able to incorporate the input processing using the Input Actions feature. If you would like to learn more about the features of Unity Render Streaming, please see the [Sample page](samples.md). Also, check out [Customizing your web application](customize-webapp.md) for information on how to modify the web user interface. diff --git a/com.unity.renderstreaming/Documentation~/create-scene.md b/com.unity.renderstreaming/Documentation~/create-scene.md index e5258c5aa..06ffae0c1 100644 --- a/com.unity.renderstreaming/Documentation~/create-scene.md +++ b/com.unity.renderstreaming/Documentation~/create-scene.md @@ -2,22 +2,31 @@ This tutorial explains how to edit an empty scene in Unity Editor and display the image rendered from the camera to the browser. -## Setting component +## Changing Project Settings -If Unity version is 2020 or later, Create a new empty scene. Select **File > New Scene** from the menu to open the dialog and select **Basic (Built-in)**. +The procedure described in this page assumes that the [**Automatic Streaming**](settings.md##general-settings) feature is not used. Please turn the flag off following steps. -![Create new scene](images/create_new_scene.png) +1: Open the **Project Settings** window. + +2: Select **Render Streaming** tab. + +3: Select **Create New Settings Asset**. + +4: Save the asset with any name. -Select the **Main Camera** object in the Hierarchy window, and add the **Render Streaming** component in the Inspector window. +5: Disable **Automatic Streaming**. -![Add RenderStreaming component](images/add_renderstreaming_component.png) +![Disable Automatic Streaming](images/disable_automaticstreaming.png) -Update properties in the inspector. +## Setting component + +If Unity version is 2020 or later, Create a new empty scene. Select **File > New Scene** from the menu to open the dialog and select **Basic (Built-in)**. + +![Create new scene](images/create_new_scene.png) -- **Signaling Type** : `WebSocketSignaling` -- **Signaling URL** : `ws://localhost` +Select the **Main Camera** object in the Hierarchy window, and add the **Signaling Manager** component in the Inspector window. -![Create scene 03](images/change_properties_websocket.png) +![Add SignalingManager component](images/add_signalingmanager_component.png) Next, we will add the **Broadcast** component to the **Main Camera** object. this component deliver the stream to multiple peers. @@ -31,7 +40,7 @@ Add a [**Video Stream Sender**](video-streaming.html#videostreamsenderapiunityre ![Add VideoStreamSender component](images/add_videostreamsender_component.png) -Assign the [**Video Stream Sender**](video-streaming.html#videostreamsenderapiunityrenderstreamingvideostreamsenderhtml-component) component to the **Broadcast** component property. +Assign the [**Video Stream Sender**](video-streaming.html#videostreamsenderapiunityrenderstreamingvideostreamsenderhtml-component) component to the **Broadcast** component property. And set camera ![Assign VideoStreamSender component to streams](images/assign_videostreamsender_to_streams.png) diff --git a/com.unity.renderstreaming/Documentation~/data-streaming.md b/com.unity.renderstreaming/Documentation~/data-streaming.md index 331f20a8b..98f6f5502 100644 --- a/com.unity.renderstreaming/Documentation~/data-streaming.md +++ b/com.unity.renderstreaming/Documentation~/data-streaming.md @@ -2,7 +2,7 @@ Data streaming is using [`RTCDataChannel`](https://docs.unity3d.com/Packages/com.unity.webrtc@2.4/manual/datachannel.html) of the WebRTC package internally. -Using the data streaming feature, we provide a component to send messages of [Input System](https://docs.unity3d.com/Packages/com.unity.inputsystem@latest). For more details, please check the section on [Using with Input System](use-inputsystem.md). +Using the data streaming feature, Unity Render Streaming provides a component to send messages of [Input System](https://docs.unity3d.com/Packages/com.unity.inputsystem@latest). ## [`InputSender`](../api/Unity.RenderStreaming.InputSender.html) component reference diff --git a/com.unity.renderstreaming/Documentation~/deploy-to-furioos.md b/com.unity.renderstreaming/Documentation~/deploy-to-furioos.md deleted file mode 100644 index 23f9eac76..000000000 --- a/com.unity.renderstreaming/Documentation~/deploy-to-furioos.md +++ /dev/null @@ -1,19 +0,0 @@ -# Deploy to Furioos - -As you may already know, **Unity Render Streaming** has a Furioos-compatible signaling option. This means that you can build a dedicated version of your application, host it on **Furioos**, and share it with thousands of customers who will enjoy all the features of **Unity Render Streaming**. But you will **not** have to deal with any of the difficulties of setting up a private server, a machine in the cloud or manage the scalability of your solution. - -To do so, the requirement is to select `FurioosSignaling` in the `Signaling type` parameter of the [RenderStreaming](streaming-management.md#render-streaming) component. -This allow your application to connect to Furioos services when running on the managed virtual machines. - -![Selecting FurioosSignaling](images/furioos_signaling.png) - -Then just build a **standalone Windows version** of your application, and zip it! Don't try to build iOS, Android, linux or whatever version of your app, **Furioos only support Windows applications**. Also, be sure to zip the whole exported folder with all files and sub-folders, not just the ".exe" file. - -![Selecting FurioosSignaling](images/furioos_zip_folder.png) - -Finally just upload it on your account at https://portal.furioos.com/ . -If you need futher help to upload your application on **Furioos**, please follow [this tutorial](https://support.furioos.com/article/adding-an-application-on-furioos/). - -You can check the stream type on https://portal.furioos.com/ by clicking to the "more options" button in the toolbar. - -![Selecting FurioosSignaling](images/furioos_stream_type.png) \ No newline at end of file diff --git a/com.unity.renderstreaming/Documentation~/dev-streaming-app-intro.md b/com.unity.renderstreaming/Documentation~/dev-streaming-app-intro.md index 8301cb51d..d3b78f266 100644 --- a/com.unity.renderstreaming/Documentation~/dev-streaming-app-intro.md +++ b/com.unity.renderstreaming/Documentation~/dev-streaming-app-intro.md @@ -2,14 +2,6 @@ This section will walk you through the steps to create a simple streaming application from an empty Unity project. -## Install The Package - -Install the package to start working. Please refer to the [Installing the package](installation.md) page to get started. - -## Start the web application - -After installing the package, please refer to the [Launching the Web Application](launch-webapp.md) page. - ## Creating The Scene To open the Unity editor and create a scene for streaming, see [Creating The Scene](create-scene.md). diff --git a/com.unity.renderstreaming/Documentation~/images/add_renderstreaming_component.png b/com.unity.renderstreaming/Documentation~/images/add_renderstreaming_component.png deleted file mode 100644 index 1a7432cbc..000000000 Binary files a/com.unity.renderstreaming/Documentation~/images/add_renderstreaming_component.png and /dev/null differ diff --git a/com.unity.renderstreaming/Documentation~/images/add_signalingmanager_component.png b/com.unity.renderstreaming/Documentation~/images/add_signalingmanager_component.png new file mode 100644 index 000000000..e3b49b28d Binary files /dev/null and b/com.unity.renderstreaming/Documentation~/images/add_signalingmanager_component.png differ diff --git a/com.unity.renderstreaming/Documentation~/images/assign_broadcast_to_handler.png b/com.unity.renderstreaming/Documentation~/images/assign_broadcast_to_handler.png index 6ace59666..8bfdbc9a4 100644 Binary files a/com.unity.renderstreaming/Documentation~/images/assign_broadcast_to_handler.png and b/com.unity.renderstreaming/Documentation~/images/assign_broadcast_to_handler.png differ diff --git a/com.unity.renderstreaming/Documentation~/images/assign_videostreamsender_to_streams.png b/com.unity.renderstreaming/Documentation~/images/assign_videostreamsender_to_streams.png index e4a758084..ec80f33f7 100644 Binary files a/com.unity.renderstreaming/Documentation~/images/assign_videostreamsender_to_streams.png and b/com.unity.renderstreaming/Documentation~/images/assign_videostreamsender_to_streams.png differ diff --git a/com.unity.renderstreaming/Documentation~/images/audiostreamsender_inspector.png b/com.unity.renderstreaming/Documentation~/images/audiostreamsender_inspector.png index bcdcfb432..efd3b6742 100644 Binary files a/com.unity.renderstreaming/Documentation~/images/audiostreamsender_inspector.png and b/com.unity.renderstreaming/Documentation~/images/audiostreamsender_inspector.png differ diff --git a/com.unity.renderstreaming/Documentation~/images/browser_index_page.png b/com.unity.renderstreaming/Documentation~/images/browser_index_page.png new file mode 100644 index 000000000..c0a8b3351 Binary files /dev/null and b/com.unity.renderstreaming/Documentation~/images/browser_index_page.png differ diff --git a/com.unity.renderstreaming/Documentation~/images/browser_warning_cert.png b/com.unity.renderstreaming/Documentation~/images/browser_warning_cert.png new file mode 100644 index 000000000..fefaaea56 Binary files /dev/null and b/com.unity.renderstreaming/Documentation~/images/browser_warning_cert.png differ diff --git a/com.unity.renderstreaming/Documentation~/images/connect_from_browser.png b/com.unity.renderstreaming/Documentation~/images/connect_from_browser.png new file mode 100644 index 000000000..aca7bf58d Binary files /dev/null and b/com.unity.renderstreaming/Documentation~/images/connect_from_browser.png differ diff --git a/com.unity.renderstreaming/Documentation~/images/control_camera_06.png b/com.unity.renderstreaming/Documentation~/images/control_camera_06.png index b8f10b381..3e366f42c 100644 Binary files a/com.unity.renderstreaming/Documentation~/images/control_camera_06.png and b/com.unity.renderstreaming/Documentation~/images/control_camera_06.png differ diff --git a/com.unity.renderstreaming/Documentation~/images/disable_automaticstreaming.png b/com.unity.renderstreaming/Documentation~/images/disable_automaticstreaming.png new file mode 100644 index 000000000..fdeac2a8f Binary files /dev/null and b/com.unity.renderstreaming/Documentation~/images/disable_automaticstreaming.png differ diff --git a/com.unity.renderstreaming/Documentation~/images/ice-server-configuration-browser.png b/com.unity.renderstreaming/Documentation~/images/ice-server-configuration-browser.png new file mode 100644 index 000000000..277fb5c07 Binary files /dev/null and b/com.unity.renderstreaming/Documentation~/images/ice-server-configuration-browser.png differ diff --git a/com.unity.renderstreaming/Documentation~/images/inputreceiver_inspector.png b/com.unity.renderstreaming/Documentation~/images/inputreceiver_inspector.png index ed64f7929..7d8ab06e0 100644 Binary files a/com.unity.renderstreaming/Documentation~/images/inputreceiver_inspector.png and b/com.unity.renderstreaming/Documentation~/images/inputreceiver_inspector.png differ diff --git a/com.unity.renderstreaming/Documentation~/images/install_select_add_package_by_name.png b/com.unity.renderstreaming/Documentation~/images/install_select_add_package_by_name.png new file mode 100644 index 000000000..7c1b5df8b Binary files /dev/null and b/com.unity.renderstreaming/Documentation~/images/install_select_add_package_by_name.png differ diff --git a/com.unity.renderstreaming/Documentation~/images/install_select_packman_menu.png b/com.unity.renderstreaming/Documentation~/images/install_select_packman_menu.png new file mode 100644 index 000000000..a5118ef27 Binary files /dev/null and b/com.unity.renderstreaming/Documentation~/images/install_select_packman_menu.png differ diff --git a/com.unity.renderstreaming/Documentation~/images/launch_webapp_terminal.png b/com.unity.renderstreaming/Documentation~/images/launch_webapp_terminal.png new file mode 100644 index 000000000..274fca21a Binary files /dev/null and b/com.unity.renderstreaming/Documentation~/images/launch_webapp_terminal.png differ diff --git a/com.unity.renderstreaming/Documentation~/images/launch_webserver_private_mode.png b/com.unity.renderstreaming/Documentation~/images/launch_webserver_private_mode.png index 4354a2f11..2922b8507 100644 Binary files a/com.unity.renderstreaming/Documentation~/images/launch_webserver_private_mode.png and b/com.unity.renderstreaming/Documentation~/images/launch_webserver_private_mode.png differ diff --git a/com.unity.renderstreaming/Documentation~/images/launch_webserver_public_mode.png b/com.unity.renderstreaming/Documentation~/images/launch_webserver_public_mode.png index 9717e0e90..a042a92c7 100644 Binary files a/com.unity.renderstreaming/Documentation~/images/launch_webserver_public_mode.png and b/com.unity.renderstreaming/Documentation~/images/launch_webserver_public_mode.png differ diff --git a/com.unity.renderstreaming/Documentation~/images/playground_scene.png b/com.unity.renderstreaming/Documentation~/images/playground_scene.png new file mode 100644 index 000000000..763d794bf Binary files /dev/null and b/com.unity.renderstreaming/Documentation~/images/playground_scene.png differ diff --git a/com.unity.renderstreaming/Documentation~/images/playground_scene_virtualpad.png b/com.unity.renderstreaming/Documentation~/images/playground_scene_virtualpad.png new file mode 100644 index 000000000..17a519009 Binary files /dev/null and b/com.unity.renderstreaming/Documentation~/images/playground_scene_virtualpad.png differ diff --git a/com.unity.renderstreaming/Documentation~/images/renderstreaming_inspector.png b/com.unity.renderstreaming/Documentation~/images/renderstreaming_inspector.png deleted file mode 100644 index 279a8978b..000000000 Binary files a/com.unity.renderstreaming/Documentation~/images/renderstreaming_inspector.png and /dev/null differ diff --git a/com.unity.renderstreaming/Documentation~/images/renderstreaming_settings.png b/com.unity.renderstreaming/Documentation~/images/renderstreaming_settings.png new file mode 100644 index 000000000..e8a9ccaf1 Binary files /dev/null and b/com.unity.renderstreaming/Documentation~/images/renderstreaming_settings.png differ diff --git a/com.unity.renderstreaming/Documentation~/images/renderstreaming_wizard.png b/com.unity.renderstreaming/Documentation~/images/renderstreaming_wizard.png new file mode 100644 index 000000000..b4c9e81d2 Binary files /dev/null and b/com.unity.renderstreaming/Documentation~/images/renderstreaming_wizard.png differ diff --git a/com.unity.renderstreaming/Documentation~/images/sample_menu_scene.png b/com.unity.renderstreaming/Documentation~/images/sample_menu_scene.png index 357bd5f25..ea2565061 100644 Binary files a/com.unity.renderstreaming/Documentation~/images/sample_menu_scene.png and b/com.unity.renderstreaming/Documentation~/images/sample_menu_scene.png differ diff --git a/com.unity.renderstreaming/Documentation~/images/sample_menu_setting_panel.png b/com.unity.renderstreaming/Documentation~/images/sample_menu_setting_panel.png index 34e624b2c..57758c343 100644 Binary files a/com.unity.renderstreaming/Documentation~/images/sample_menu_setting_panel.png and b/com.unity.renderstreaming/Documentation~/images/sample_menu_setting_panel.png differ diff --git a/com.unity.renderstreaming/Documentation~/images/signalingmanager_inspector.png b/com.unity.renderstreaming/Documentation~/images/signalingmanager_inspector.png new file mode 100644 index 000000000..7dbb57210 Binary files /dev/null and b/com.unity.renderstreaming/Documentation~/images/signalingmanager_inspector.png differ diff --git a/com.unity.renderstreaming/Documentation~/images/turn-server-settings.png b/com.unity.renderstreaming/Documentation~/images/turn-server-settings.png new file mode 100644 index 000000000..b3e91bbf0 Binary files /dev/null and b/com.unity.renderstreaming/Documentation~/images/turn-server-settings.png differ diff --git a/com.unity.renderstreaming/Documentation~/images/unityhub_createproject.png b/com.unity.renderstreaming/Documentation~/images/unityhub_createproject.png new file mode 100644 index 000000000..51573b004 Binary files /dev/null and b/com.unity.renderstreaming/Documentation~/images/unityhub_createproject.png differ diff --git a/com.unity.renderstreaming/Documentation~/images/unityhub_select_template.png b/com.unity.renderstreaming/Documentation~/images/unityhub_select_template.png new file mode 100644 index 000000000..d6a5438c3 Binary files /dev/null and b/com.unity.renderstreaming/Documentation~/images/unityhub_select_template.png differ diff --git a/com.unity.renderstreaming/Documentation~/images/wizard_download_webapp.png b/com.unity.renderstreaming/Documentation~/images/wizard_download_webapp.png new file mode 100644 index 000000000..ad96793d4 Binary files /dev/null and b/com.unity.renderstreaming/Documentation~/images/wizard_download_webapp.png differ diff --git a/com.unity.renderstreaming/Documentation~/images/wizard_fixall.png b/com.unity.renderstreaming/Documentation~/images/wizard_fixall.png new file mode 100644 index 000000000..9f8e01ac3 Binary files /dev/null and b/com.unity.renderstreaming/Documentation~/images/wizard_fixall.png differ diff --git a/com.unity.renderstreaming/Documentation~/index.md b/com.unity.renderstreaming/Documentation~/index.md index a97138aec..f574d935f 100644 --- a/com.unity.renderstreaming/Documentation~/index.md +++ b/com.unity.renderstreaming/Documentation~/index.md @@ -16,14 +16,14 @@ This package provides the main features below. We can broadcast video rendered on Unity to browsers via network. For example, It can show the video rendered with HDRP on the browser on the iPad. In addition, broadcasting from multiple cameras is supported. -![feature-multicamera](images/feature_multicamera.png) +![Render Streaming Wizard](images/feature_multicamera.png) ### Audio streaming This package enables streaming sounds generated on Unity. And it can cast to multi-browsers simultaneously. ### Remote control -It is possible to send input messages to Unity from the browser, and sending inputs from multiple browsers is supported. Mouse, keyboard, touch, and gamepad are supported as input devices on the browser. For more information, please see the [Using with Input System](use-inputsystem.md) page. +It's possible to send input messages to Unity from the browser, and sending inputs from multiple browsers is supported. Mouse, keyboard, touch, and gamepad are supported as input devices on the browser. ## Requirements @@ -31,15 +31,19 @@ This version of Render Streaming is compatible with the following versions of th - **Unity 2020.3** - **Unity 2021.3** -- **Unity 2022.1** +- **Unity 2022.3** +- **Unity 2023.1** ### Platform -- **Windows** +- **Windows** (x64 only) - **Linux** -- **macOS** (**Apple Slicon** is not supported yet) +- **macOS** (**Intel** and **Apple Slicon**) - **iOS** -- **Android** (**ARMv7** is not supported) +- **Android** (**ARM64** only. **ARMv7** is not supported) + +> [!NOTE] +> This package depends on [the WebRTC package](https://docs.unity3d.com/Packages/com.unity.webrtc@3.0). If you build for mobile platform (iOS/Android), please see [the package documentation](https://docs.unity3d.com/Packages/com.unity.webrtc@3.0/manual/requirements.html#additional-notes) to know the requirements for building. ### Browser support @@ -61,14 +65,3 @@ Unity Render Streaming supports almost all browsers that can use WebRTC. ## Samples Please check [this page](samples.md). - -## Project template - -Please check [this page](template.md). - -## Furioos compatibility - -**Unity Render Streaming** is also supported natively by **Furioos** platform https://www.furioos.com/ . -That means that you can easily build a Unity application, upload it on **Furioos** and enjoy all the features of **Unity Render Streaming** without worrying about the deployment and scalability issues of your project. - -Please see [Furioos Tutorial](deploy-to-furioos.md) section to find out how it works. diff --git a/com.unity.renderstreaming/Documentation~/installation.md b/com.unity.renderstreaming/Documentation~/installation.md deleted file mode 100644 index a00df3ad0..000000000 --- a/com.unity.renderstreaming/Documentation~/installation.md +++ /dev/null @@ -1,27 +0,0 @@ -# Installing The Package - -Select **Window > Package Manager** in the menu bar. - -![Install Package Manager from menu bar](images/install_select_packman_menu_unity2020.png) - -Check Package Manager window, Click `+` button and select `Add package from git URL...`. - -![Select add package from git url](images/install_select_add_package_from_git_url.png) - -Input the string below to the input field. - -``` -com.unity.renderstreaming@3.1.0-exp.4 -``` - -The list of version string is [here](https://github.com/Unity-Technologies/UnityRenderStreaming/tags). In most cases, the latest version is recommended to use. - - Click `Add` button, and will start install the package. - -If an input system dialog box appears, click `Yes` - -![Input system backend](images/input_system_backend.png) - -## Next Step - -After installing the package in the Unity Editor, you can launch the web application for signaling. Please see the next page [Launching The Web Application](launch-webapp.md). diff --git a/com.unity.renderstreaming/Documentation~/launch-webapp.md b/com.unity.renderstreaming/Documentation~/launch-webapp.md deleted file mode 100644 index eb892033e..000000000 --- a/com.unity.renderstreaming/Documentation~/launch-webapp.md +++ /dev/null @@ -1,52 +0,0 @@ -# Launching The Web Application - -After installing the package, you will need to install and run the signaling server. If you want to learn about signaling, you can see [this page](overview.md). - -## Download web application - -Click on **Edit > Render Streaming > Download web app** menu item on Unity Editor to download the application. -The download site is [this page](https://github.com/Unity-Technologies/UnityRenderStreaming/releases). - -![Download webapp](images/download_webapp.png) - -When the select download folder window appears, click on `Select Folder` to download the file to the default folder - -![Select Download folder](images/select_download_folder.png) - -## Run command on terminal - -After the download is finished and a `powershell` or `cmd` window is opened, and run `webserver.exe` with `-w` option. Please refer to [this page](webapp.md) for commandline options. - -``` -.\webserver.exe -w -``` - -You can see logs on the commandline like below. - -![Launch web server](images/launch_webserver_public_mode_on_windows.png) - -### Launch server on Linux or macOS - -If you use it on **macOS** or **Linux**, please run the command below to give the execute permission. - -``` -# for Linux -chmod a+x ./webserver - -# for macOS -chmod a+x ./webserver_mac -``` - -### Checking on browser - -To check if the web server is up and running, access it from your browser. Basically, any modern browser will work. Access `http://localhost` from your browser. If the web page is displayed as shown below, there is no problem. - -![Access from browser](images/access_webapp_from_browser.png) - -## Next Step - -You downloaded the web application and launched it. This application can be freely modified by developers. To get the source code, please visit the [GitHub repository](https://github.com/Unity-Technologies/UnityRenderStreaming). - -Then, the web application also provides some useful command options. If you want more detailed information, please refer to [the web application page](webapp.md). - -The next step is to work on the Unity project. Go to the [Creating The Scene](create-scene.md) page. \ No newline at end of file diff --git a/com.unity.renderstreaming/Documentation~/samples.md b/com.unity.renderstreaming/Documentation~/samples.md index 799c946f1..944225e22 100644 --- a/com.unity.renderstreaming/Documentation~/samples.md +++ b/com.unity.renderstreaming/Documentation~/samples.md @@ -38,18 +38,19 @@ Open **Menu** scene and press `Play` button, as you can see the menu for sample You can change signaling settings below during runtime. | Parameter | Description | -| ----------- | --------------------------- | -| [**Signaling Type**](signaling-type.md) | *Http*, *WebSocket* or *Furioos* | -| **Enable/Disable SSL** | Use *https* if set enable. | +| --- | --- | +| **Use Default Settings** | Refer to settings of [Project Settings](settings.md). | +| [**Signaling Type**](signaling-type.md) | *Http* or *WebSocket*. | +| **Enable/Disable SSL** | Use **https** if set enable. | | **Host Address** | Set IP address or URL of your signaling server. | -| **Interval** | Polling interval for communication of signaling.
This parameter effects Http signaling. | +| **Interval (msec)** | Polling interval for communication of signaling.
This parameter effects Http signaling. | ![Sample menu](images/sample_menu_setting_panel.png) Moreover, you can choice the options about the video streaming settings. | Parameter | Description | -|-----------|---------------------------| +| --- | ---| | **Video Codec (Receiver)** | Choice preferred video codec for receiver.
Often the performance of [Hardware codec](https://docs.unity3d.com/Packages/com.unity.webrtc@2.4/manual/videostreaming.html#hardware-acceleration-codecs) is greater than software codec. | | **Video Codec (Sender)** | Choice preferred video codec for sender. | | **Stream Size** | Set the resolution of video streaming for sender. | diff --git a/com.unity.renderstreaming/Documentation~/settings.md b/com.unity.renderstreaming/Documentation~/settings.md new file mode 100644 index 000000000..28eb62d0e --- /dev/null +++ b/com.unity.renderstreaming/Documentation~/settings.md @@ -0,0 +1,30 @@ +# Render Streaming Settings + +Unity Render Streaming saves configuration assets to the project. The configuration asset are created in the Render Streaming panel of the Project Settings Window. If your project contains more than one configuration asset, select the asset in the Render Streaming Settings section. + +![Render Streaming Project Settings](images/renderstreaming_settings.png) + +## General Settings + +| Parameter | Description | Default | +| ---- | ---- | ---- | +| **Automatic Streaming** | Automatically performs the necessary setup for streaming and starts streaming. | Enabled | + +### Behaviour of the Automatic Streaming flag + +If the **Automatic Streaming** flag is turned on, the application will automatically set up for streaming when it's started. This initialization process takes place before calling the **MonoBehaviour.Start** method on the scene. When streaming starts, the screen on the game view and the audio played by the **AudioListener** are delivered. It also receives mouse and keyboard input from the client and is configured to work with the Input System. + +Streaming continues even when moving between scenes. If you want to stop streaming, turn the **Automatic Streaming** flag off. + +## Signaling Settings + +| Parameter | Description | Default | +| ---- | ---- | ---- | +| **Signaling Type** | Choose the signaling type (See [About Signaling Type](signaling-type.md)). | websocket | +| **Signaling Server URL** | Set the signaling server URL.
If you use WebSocket as a signaling protocol, you should specify a URL starting with **ws** or **wss**. | ws://127.0.0.1 | +| **ICE Server** | Set a list of STUN/TURN servers. (See [TURN Server](turnserver.md)) | | +| **URLs** | Set URLs of STUN/TURN servers. | [stun:stun.l.google.com:19302\] | +| **Username** | The username to use when logging into the TURN server. | | +| **Credencial** | The credential to use when logging into the TURN server. | | +| **Credencial Type** | This attribute specifies what kind of **credential** is to be used when connecting to the TURN server. | Password | +| **Polling Interval** | Set the polling frequency (in milliseconds) to the signaling server
Valid only if you are using Http as the signaling protocol. | 5000 (msec) | diff --git a/com.unity.renderstreaming/Documentation~/signaling-type.md b/com.unity.renderstreaming/Documentation~/signaling-type.md index 812334fe7..90ebf7e9d 100644 --- a/com.unity.renderstreaming/Documentation~/signaling-type.md +++ b/com.unity.renderstreaming/Documentation~/signaling-type.md @@ -4,7 +4,6 @@ - `Http Signaling` - `WebSocket Signaling` -- `Furioos Signaling` In the example, the schema given to `URL Signaling` is used to determine which type to use. @@ -13,11 +12,11 @@ In the example, the schema given to `URL Signaling` is used to determine which t If it starts with `http`, `Http Signaling` is used. If it starts with `ws`, `WebSocket Signaling` is used. ``` -# launch server for HTTP -webserver.exe - # launch server for WebSocket -webserver.exe -w +webserver.exe + +# launch server for HTTP +webserver.exe -t http ``` ## `Http Signaling` @@ -32,7 +31,3 @@ When the signaling server receives the Offer or Candidate, the server distribute > [!WARNING] > WebSocket does not work in iOS Safari on servers that use self-signed certificates. > If you want to verify the behavior of WebSocket signaling in iOS Safari, use a certificate issued by a trusted certification authority. Or try signaling with HTTP. - -## `Furioos Signaling` - -Please see [this page](deploy-to-furioos.md). \ No newline at end of file diff --git a/com.unity.renderstreaming/Documentation~/streaming-management.md b/com.unity.renderstreaming/Documentation~/streaming-management.md index d753db592..cfe3f6e76 100644 --- a/com.unity.renderstreaming/Documentation~/streaming-management.md +++ b/com.unity.renderstreaming/Documentation~/streaming-management.md @@ -2,30 +2,33 @@ Unity Render Streaming automatically creates and destroys streams as needed. It also allows the developer to customize the mechanism for controlling the stream. For a description of components related to individual streams, see the section on components for streaming. -## [`RenderStreaming`](../api/Unity.RenderStreaming.RenderStreaming.html) component reference +## [`SignalingManager`](../api/Unity.RenderStreaming.SignalingManager.html) component reference -**Render Streaming** includes the following features. +**SignalingManager** includes the following features. - Communication with signaling servers - Streaming input from cameras - Associating browser input with events -![Render Streaming Inspector](images/renderstreaming_inspector.png) +![Render Streaming Inspector](images/signalingmanager_inspector.png) ### Properties | Parameter | Description | Default | -| --------- | ----------- | ------- | -| **Signaling Type** | Class type of the signaling (See [About Signaling Type](signaling-type.md)). | `WebSocketSignaling` | -| **Signaling URL** | Set the signaling server URL
If you use WebSocket as a signaling protocol, you should specify a URL starting with `ws` or `wss`. | `ws://localhost` | +| ---- | ---- | ---- | +| **Use Default Settings in Project Settings** | Use settings in [Project Settings Window](settings.md). | Enabled | +| **Signaling Settings Asset** | Choose the signaling settings. | | +| **Signaling Type** | Choose the signaling type (See [About Signaling Type](signaling-type.md)). | websocket | +| **URL** | Set the signaling server URL.
If you use WebSocket as a signaling protocol, you should specify a URL starting with **ws** or **wss**. | ws://127.0.0.1 | | **Ice Servers** | Set a list of STUN/TURN servers. (See [TURN Server](turnserver.md)) | | | *Urls* | Set URLs of STUN/TURN servers. | `[stun:stun.l.google.com:19302\]` | | *Username* | The username to use when logging into the TURN server. | | | *Credencial* | The credential to use when logging into the TURN server. | | -| *Credencial Type* | This attribute specifies what kind of `credential` is to be used when connecting to the TURN server. | `Password` | -| **Interval** | Set the polling frequency (in seconds) to the signaling server
Valid only if you are using Http as the signaling protocol. | 5 (sec) | -| **Handlers** | List of handlers of signaling process. | | -| **Run On Awake** | Automatically started when called `Awake` method. | `True` | +| *Credencial Type* | This attribute specifies what kind of **credential** is to be used when connecting to the TURN server. | **Password** | +| **Polling Interval** | Set the polling frequency (in milliseconds) to the signaling server
Valid only if you are using Http as the signaling protocol. | 5000 (msec) | +| **Run On Awake** | Automatically started when called `Awake` method. | Enabled | +| **Evaluate Command Line Arguments** | Evaluate [command line arguments](commandline-option.md). | Enabled | +| **Signlaing Handler List** | List of handlers of signaling process. | | ## [`SingleConnection`](../api/Unity.RenderStreaming.SingleConnection.html) component reference diff --git a/com.unity.renderstreaming/Documentation~/template.md b/com.unity.renderstreaming/Documentation~/template.md deleted file mode 100644 index 0691b3d3d..000000000 --- a/com.unity.renderstreaming/Documentation~/template.md +++ /dev/null @@ -1,63 +0,0 @@ -# Project Template - -This document describes the way to start using the template package of Unity Render Streaming. - -### Download the Package - -Download the template package from [Github Release](https://github.com/Unity-Technologies/com.unity.webrtc/releases). Please download the package below. - -- `com.unity.template.renderstreaming-x.x.x-preview.tgz` - -![Download template package](images/download_template_package.png) - -> [!NOTE] -> This process made for temporary use. It is not needed if these packages are registered to PackageManager in the future. - -### Install the package - -Put the package in a dedicated folder in order to use them as a project template. -The project template can be selected as a template when creating a new Unity project. - -![Template unityhub](images/template_in_unityhub.png) - -When using the template package, put the tgz file in the following folders. -Move `com.unity.template.renderstreaming-x.x.x-preview.tgz` to this folder - -``` - /Data/Resources/PackageManager/ProjectTemplates -``` - -After moving the packages, open the Unity Hub and create a new project. Confirm that `Render Streaming` has been added as a template. - -### Launch the Web application - -To launch web application, Select an item **Edit / Render Streaming / Download web app** from the menu bar. - -![Menu download webapp](images/download_webapp.png) - -Be shown the command prompt when execute the file. Confirm that the following log displays in the command prompt. The web server's address should be displayed. Details on web server command options can be found on the [Web server](webserver.md) page. - -![Launch Web Server command](images/launch_webserver_public_mode_on_windows.png) - -The web server's source code is located in the `WebApp` folder. Additionally, [Node.js](https://nodejs.org) must be installed in order to run the source code. Download the installer from the website. - -### Unity Settings - -Open the `Assets/Scenes/samplescene.unity` sample scene. - -![HDRP scene](images/hdrpscene.png) - -Select `RenderStreaming` in the Hierarchy. Check the `Render Streaming` components in the Inspector. - -![Render Streaming inspector](images/renderstreaming_inspector.png) - -Set the address of the web server you just activated under the `URL Signaling` parameter. For details on the various settings in the Inspector. - -### Accessing the Web Page - -Launch one of the [supported browsers](../index.md) from the list. -Access the Web server's address. The following web page will be displayed. - -![Browser HDRP scene](images/browser_hdrpscene.png) - -If this doesn't happen, it's possible that the browser version is too old. Be sure to install the latest version. \ No newline at end of file diff --git a/com.unity.renderstreaming/Documentation~/turnserver.md b/com.unity.renderstreaming/Documentation~/turnserver.md index c132bed66..71117f0f7 100644 --- a/com.unity.renderstreaming/Documentation~/turnserver.md +++ b/com.unity.renderstreaming/Documentation~/turnserver.md @@ -9,7 +9,7 @@ This document covers the process of linking Unity Render Streaming to a TURN ser ## Instance settings -[coturn](https://github.com/coturn/coturn) software is an open source implementation for TURN servers. +[coturn](https://github.com/coturn/coturn) software is an open source implementation for TURN servers. The following is an explanation for running coturn on a GCP instance. **ubuntu-minimal-1604-xenial-v20190628** is used in the instance image so that the `apt` command can be used to install coturn. If the distribution is supported by coturn, there shouldn't be any issues. See the [coturn documentation](https://github.com/coturn/coturn) for details on coturn. @@ -27,15 +27,15 @@ The port used by the TURN server needs to be public, so add the following settin ### Installing coturn -Log into the GCP instance with `ssh`. +Log into the GCP instance with `ssh`. Install `coturn`. ```shell sudo apt install coturn ``` -Change the settings for booting with a daemon to use coturn as a TURN server. -Edit the following file. +Change the settings for booting with a daemon to use coturn as a TURN server. +Edit the following file. ```shell sudo vim /etc/default/coturn @@ -72,7 +72,7 @@ realm=yourcompany.com log-file=/var/tmp/turn.log ``` -When finished, restart the coturn service. +When finished, restart the coturn service. ```shell sudo systemctl restart coturn @@ -96,25 +96,16 @@ Use the [webrtc sample](https://webrtc.github.io/samples/src/content/peerconnect ![TURN connection testing](images/turn-connection-testing.png) -Click `Gather candidates` to show a list of potential communication paths. Verify that a log is also printed on the TURN server side. +Click `Gather candidates` to show a list of potential communication paths. Verify that a log is also printed on the TURN server side. ### Browser side changes -Change the `config.iceServers` settings under `video-player.js` on the browser side. - -```javascript -config.iceServers = [{ - urls: ['stun:stun.l.google.com:19302'] - }, { - urls: ['turn:xx.xx.xx.xx:3478?transport=tcp'], - username: 'username', - credential: 'password' - } -]; -``` +Start the web server, access the site, and add the TURN server settings to each of the ICE servers as follows: + +![Set ICE Servers Configuration On Browser](images/ice-server-configuration-browser.png) -### Unity side changes +### Unity side changes -Add the TURN server settings to `Ice Server` in the `Render Streaming` inspector. +Open the Project Settings window and add the URL of the TURN server to the Render Streaming settings as shown below. -![TURN Render Streaming inspector](images/turn-renderstreaming-inspector.png) +![TURN Server Settings](images/turn-server-settings.png) diff --git a/com.unity.renderstreaming/Documentation~/tutorial.md b/com.unity.renderstreaming/Documentation~/tutorial.md index 0119419e1..5c4eaf1fe 100644 --- a/com.unity.renderstreaming/Documentation~/tutorial.md +++ b/com.unity.renderstreaming/Documentation~/tutorial.md @@ -1,96 +1,110 @@ # Tutorial -In this page, we introduce the way to use samples published on Package Manager. +This page describes how to create a scene that uses Unity Render Streaming, and introduces you to key features that help you produce the 3D contents works on browsers via streaming. -## Install package +## Before you begin -Select **Window > Package Manager** in the menu bar. +- Please read the [Requirements](index.md#requirements) to understand the limitation. +- This tutorial uses **localhost** and port **80** for the signaling server. Please read [Signaling Settings](settings.md#signaling-settings) page if you want to change the address and port number. -![Install Package Manager from menu bar](images/install_select_packman_menu_unity2020.png) +## Creating a Unity project from the Template -Check Package Manager window, Click `+` button and select `Add package from git URL...`. +1: Open the Unity Hub. -![Select add package from git url](images/install_select_add_package_from_git_url.png) +2: Go to **Projects**, and select **New Project**. -Input the string below to the input field. +![Create Unity project in Unity Hub](images/unityhub_createproject.png) -``` -com.unity.renderstreaming@3.1.0-exp.4 -``` +3: Open the **Core** tab and select **Third Person**. + +![Select Template in Unity Hub](images/unityhub_select_template.png) + +4: Enter a **Project name**. -The list of version string is [here](https://github.com/Unity-Technologies/com.unity.renderstreaming/tags). In most cases, the latest version is recommended to use. +5: Select **Create Project**. - Click `Add` button, and will start install the package. +Unity creates a project, and after Unity opens the Template Project, you can see the **Playground** scene. -If an input system dialog box appears, click `Yes` +![Playground scene](images/playground_scene.png) -![Input system backend](images/input_system_backend.png) +This template is designed to work on many platforms, so it is an good starting point for projects aiming for streaming. If you want to achieve a high-end graphics, we recommend using the HDRP sample templates. -## Install web application +## Unity Render Streaming setup -Click on **Edit > Render Streaming > Download web app** menu item to download the application from [this page](https://github.com/Unity-Technologies/UnityRenderStreaming/releases). +1: Select **Window > Package Manager** in the menu bar. -![Download webapp](images/download_webapp.png) +![Install Package Manager from menu bar](images/install_select_packman_menu.png) -When the select download folder window appears, click on `Select Folder` to download the file to the default folder +2: Check Package Manager window, Click **+** button and select **Add package by name**. If you use Unity 2020.3, select **Add package from git URL**. -![Select Download folder](images/select_download_folder.png) +![Select add package from git url](images/install_select_add_package_by_name.png) -After the download is finished and a `powershell` or `cmd` window is opened, and run `webserver.exe` with `-w` option. Please refer to [this page](webapp.md) for commandline options. +3: Input the string below to the input field. ``` -.\webserver.exe -w +com.unity.renderstreaming ``` -You can see logs on the commandline like below. +4: The **Render Streaming Wizard** window is opened automatically after installing the package. Select **Fix All**. -![Launch web server](images/launch_webserver_public_mode_on_windows.png) +![Input system backend](images/wizard_fixall.png) -If you use it on macOS or Linux, please run the command below to give the execute permission. +5: Select **Play** on Unity Editor. -``` -# for Linux -chmod a+x ./webserver +## Launch web app -# for macOS -chmod a+x ./webserver_mac -``` +1: Select **Download latest version web app** on the Render Streaming Wizard window. + +![Download web app](images/wizard_download_webapp.png) + +2: Launch the app. + +It is succeeded if you can see logs in the console like below. + +![Launch web app on terminal](images/launch_webapp_terminal.png) + +## Connect from browser + +1: Launch the browser.
Please see the supported browsers list in the [Requirements](index.md) page. + +2: Go to **http://127.0.0.1** on the browser. + +3: Select **Receiver Sample**. + +![Browser Index Page](images/browser_index_page.png) -## Install samples +4: Select **Play**. -You can import Samples from the bottom of the `com.unity.renderstreaming` package in the PackageManager Window. +You can see the game view on the browser, and the mouse and keyboard input effects the game view. -![Sample List](images/renderstreaming_samples.png) +![Connect from browser](images/connect_from_browser.png) -## Play Unity +## Connect from mobile browser -Open `WebBrowserInput` scene. +1: This project contains virtual gamepad. Please select **UI_Canvas_StarterAssetsInputs_Joysticks** in Hierarchy window, and set active. -![Open WebBrowserInput scene](images/open_webbrowserinput_scene.png) +You can see the gamepad in Game View. -Enter play mode in Unity Editor. +![Activate virtual gamepad](images/playground_scene_virtualpad.png) -![Play mode](images/play_mode.png) +2: When connecting from a mobile browser, the SSL certificate must be enabled on the signaling server. Please see [this page](https.md). -Open your web browser and access `http://localhost`. You can see the top page. Click a `VideoPlayer Sample` link. +3: Start the signaling server using the created certificate. Please see the options of web server [here](webapp.md) -![Main page on the browser](images/browser_mainpage.png) +4: Set the new **URL** of the web server to Signaling Settings in Project Settings window. -You can see the Unity scene on the browser, and control a camera in the Unity scene. +5: Select **Play** on the Unity Editor. -![Video player sample on the browser](images/browser_videoplayer.png) +6: Access the web page from the mobile browser. -## Deploy to Furioos +You don't mind it if you see the warning page like below. -**Unity Render Streaming** is also supported natively by [**Furioos**](https://www.furioos.com) platform. -That means that you can easily build a Unity application, upload it on **Furioos** and enjoy all the features of Unity Render Streaming without worrying about the deployment and scalability issues of your project. +![This Connection Is Not Private](images/browser_warning_cert.png) -Please see [this page](deploy-to-furioos.md) to learn how to deploy your application on Furioos service. +7: Select **Receiver Sample**. -## After tutorial +You can see the game view on the mobile browser. -About general questions, please see [FAQ](faq.md) page. And you are available for discussions about Unity Render Streaming on [Unity Forum](https://forum.unity.com/forums/unity-render-streaming.413). +## Next Step -About the operation of inspectors, please see [Components settings](components.md) page. -About options of web application, please see [The web application](webapp.md) page. -You can see more details for samples on the [Samples](samples.md) page. +This tutorial explained an example using the Unity Project created from a template, and manipulating the character in 3D game from web browsers. An another example, developers can do the same by setting up some components on the scene. Please see [this page](dev-streaming-app-intro.md). This method allows for more detailed customization. diff --git a/com.unity.renderstreaming/Documentation~/use-inputsystem.md b/com.unity.renderstreaming/Documentation~/use-inputsystem.md deleted file mode 100644 index 5780afc90..000000000 --- a/com.unity.renderstreaming/Documentation~/use-inputsystem.md +++ /dev/null @@ -1,40 +0,0 @@ -# Using with Input System - -Unity Render Streaming supports controlling device input using [Input System](https://docs.unity3d.com/Packages/com.unity.inputsystem@latest). Input from a browser or Unity can be reflected to Unity on another PC. - -The user input on the browser is converted to the message format of Input System and sent messages to another peers. The receiver of input message supports both Unity and the browser without having to implement any additional functionality. - -## Preferences - -You need to configure settings described below to use Input System. Note that different versions of Unity Editor support different methods. - -### For Unity 2021.3 or later - -1. Open **Package Manager** window and check Input System version **1.3** installed. - -2. Open **Project Settings** window, and **Player > Resolution and Presentation**, and enable **Run In Background**. - -![Enable Run In Background](images/enable_run_in_background.png) - -3. Move **Input System Package** in **Project Settings** window, and set `Ignore Focus` for **Background Behavior**. - -![Set Ignore Focus for Background Behavior](images/set_background_behavior.png) - -4. In the **Input System Package**, set the **Play Mode Input Behavior** to `All Device Input Always Goes To Game View`. - -![Set Play Mode Input Behavior](images/set_playmode_input_behavior.png) - -### For Unity 2020.3 - -1. Check Input System version **1.3** installed. -2. Open **Project Settings** window, and **Player > Resolution and Presentation**, and enable **Run In Background**. - -![Enable Run In Background](images/enable_run_in_background.png) - -3. Open scene and move **Hierarchy** window, and select `EventSystem` object, - -![Select EventSystem object](images/select_eventsystem_object.png) - -4. Move **Inspector** window, and replace the `EventSystem` component with a `CustomEventSystem` component. `CustomEventSystem` is contained in the package sample. For import instruction, refer to [this page](samples.md). - -![Add CustomEventSystem component](images/add_customeventsystem_component.png) diff --git a/com.unity.renderstreaming/Documentation~/webapp.md b/com.unity.renderstreaming/Documentation~/webapp.md index 30f9fe617..fe6df1af7 100644 --- a/com.unity.renderstreaming/Documentation~/webapp.md +++ b/com.unity.renderstreaming/Documentation~/webapp.md @@ -1,42 +1,44 @@ # Web Application -The **Web application** +The **Web application** - handles signaling between Unity and the Web browser -- is the location of the Web page +- is the location of the Web page -## The Web Client - -The **Render Streaming** web application uses WebRTC technologies, which means that your browser must also support WebRTC. You can see a table of supported browsers [here](index.md#web-browsers-support). +The web application uses WebRTC technologies, which means that your browser must also support WebRTC. You can see a table of supported browsers [here](index.md#web-browsers-support). > [!NOTE] > See [this page](https://caniuse.com/#search=webrtc) for details on which browsers support WebRTC. -## The Web Server +## Lanching The Server + +You can get a executable file of web server from the **Wizard Window**. + +1. Select **Window > Render Streaming > Render Streaming Wizard** in the menu bar. -Click on **Edit > Render Streaming > Download web app** menu item to download our web server on [this site](https://github.com/Unity-Technologies/UnityRenderStreaming/releases). +2. Select **Download latest version web app**. -![Download webapp](images/download_webapp.png) +![Download webapp](images/wizard_download_webapp.png) -After downloading, run it from the command line. +3. Run it from the command line. ![Launch webserver explorer](images/launch_webserver_explorer.png) -### Command Options +## Command Options -| Option | Details | Default | -| ------------------------- | -------------------------------------------------- | ------------- | -| `-h` `--help` | Show the help menu | | -| `-p` `—port \` | Set the port number | `80` | -| `-s` `--secure` | Use https | | -| `-k` `—keyfile \` | Designate the private key file to use with https | `server.key` | +| Option | Details | Default | +| ------ | ------- | ------- | +| `-h` `--help` | Show the help menu | | +| `-p` `—port \` | Set the port number | `80` | +| `-s` `--secure` | Use https | | +| `-k` `—keyfile \` | Designate the private key file to use with https | `server.key` | | `-c` `—certfile \` | Designate the certification file to use with https | `server.cert` | -| `-w` `--websocket` | Use Websocket as signaling protocol | | -| `-m` `—-mode \` | Choose Communication mode public or private | `public` | -| `-l` `—logging \` | Choose http logging type (use [morgan](https://www.npmjs.com/package/morgan) library) | `dev` | +| `-t` `--type \` | Type of signaling protocol, Choose websocket or http | `websocket` | +| `-m` `—-mode \` | Choose Communication mode public or private | `public` | +| `-l` `—logging \` | Choose http logging type (use [morgan](https://www.npmjs.com/package/morgan) library) | `dev` | -### Command Examples +## Command Examples Use the following command to start the server as http. Port `80` will be used. @@ -50,13 +52,13 @@ This command will run the server as https. Port 443 will be used. A certificate .\webserver -s -p 443 ``` -The command will run in the mode that uses WebSocket as the signaling protocol. +The command will run in the mode that uses **HTTP polling** as the signaling protocol. ```shell -.\webserver -w +.\webserver -t http ``` -The command will run in private mode. +The command will run in private mode. ```shell .\webserver -m private @@ -66,7 +68,7 @@ The command will run in private mode. When running a https server, keep in mind to set the `URL signaling` property of the Renderstreaming component in Unity to https as well. -Use this command to display the help guide. +Use this command to display the help guide. ```shell .\webserver -h @@ -74,4 +76,4 @@ Use this command to display the help guide. ## How to custmize web application -Please see the page [Customize Web Application](customize-webapp.md). \ No newline at end of file +Please see the page [Customize Web Application](customize-webapp.md). diff --git a/com.unity.renderstreaming/Documentation~/wizard.md b/com.unity.renderstreaming/Documentation~/wizard.md new file mode 100644 index 000000000..ee395ab6d --- /dev/null +++ b/com.unity.renderstreaming/Documentation~/wizard.md @@ -0,0 +1,44 @@ +# Unity Render Streaming Wizard + +Unity Render Streaming includes the **Render Streaming Wizard** to help you configure your Unity Project so that it's compatible with Unity Render Streaming. + +To open **Render Streaming Wizard**, go to **Window > Render Streaming** and select **Render Streaming Wizard**. + +![Render Streaming Wizard](images/renderstreaming_wizard.png) + +## Unity Render Streaming Version + +At the top of the window, you can see the version of the Unity Render Streaming package installed in your Unity Project. The **Check Update** button provides a shortcut to the Package Manager window. + +## Configuration Checking + +Your Unity Project must adhere to all the configuration tests in this section for Unty Render Streaming to work correctly. If a test fails, a message explains the issue and you can click a button to fix it. This helps you quickly fix any major issues with your Unity Project. + +### Playmode Settings + +| Configuration Option | Description | +| --- | ---- | +| **Run In Background** | Check to make sure **Run In Background** is enabled in the Player Settings. This value is needed to continue processing user input even when losting the focus from the Unity application. (menu: **Edit > Project Settings > Player**)
Press the **Fix** button to enable **Run In Background**. | +| **InputSystem Background Behavior** | Check to make sure **Background Bahavior** is set to a **Ignore Focus** in Input System. This value is needed to continue processing user input even when losting the focus from the Unity application. (menu: **Edit > Project Settings > Input System**)
Press the **Fix** button to set **Background Bahavior** to **Ignore Focus**. | +| **InputSystem PlayMode Input Behavior** | Check to make sure **PlayMode Input Bahavior** is set to a **All Device Input Always Goes To Game View** in Input System. This value is needed to continue processing user input even when losting the focus from the Unity Editor. (menu: **Edit > Project Settings > Input System**)
Press the **Fix** button to set **PlayMode Input Bahavior** to **All Device Input Always Goes To Game View**. | + +### Build Settings + +| Configuration Option | Description | +| --- | ---- | +| **Current Build Target Platform** | Checks the platform of the **Build Target** is supported by Unity Render Streaming.
Press the **Fix** button to change the **Build Target** to the supported platform. | +| **Current Graphics API** | Checks the **Graphics API** is supported by Unity Render Streaming.
Press the **Fix** button to change the **Graphics API** to the supported graphics APIs. | +| **macOS Camera Usage Description** | Check **Camera Usage Description** for macOS platform in the Player Settings. This value is needed to use Web Camera as a video source in the [Video Stream Sender component](video-streaming.md).
Press the **Fix** button to set **Camera Usage Description** to `For using WebCam`. | +| **macOS Microphone Usage Description** | Check **Microphone Usage Description** for macOS platform in the Player Settings. This value is needed to use Microphone as a audio source in the [Audio Stream Sender component](audio-streaming.md).
Press the **Fix** button to set **Microphone Usage Description** to `For using Microphone`. | +| **iOS Camera Usage Description** | Check **Camera Usage Description** for iOS platform in the Player Settings. This value is needed to use Web Camera as a video source in the [Video Stream Sender component](video-streaming.md).
Press the **Fix** button to set **Camera Usage Description** to `For using WebCam`. | +| **iOS Microphone Usage Description** | Check **Microphone Usage Description** for iOS platform in the Player Settings. This value is needed to use Microphone as a audio source in the [Audio Stream Sender component](audio-streaming.md).
Press the **Fix** button to set **Microphone Usage Description** to `For using Microphone`. | +| **Android Minimum API Level** | Check **Minimum API Level** for Android platform in Player Settings.
Press the **Fix** button to set **Minimum API Level** to **Level24**. | +| **Android Script Backend** | Check **Scripting Backend** for Android platform in Player Settings. Unity Render Streaming only supports **IL2CPP** for Android platform.
Press the **Fix** button to set **Scripting Backend** to **IL2CPP**. +| **Android Target Architecture** | Check **Target Architecture** for Android platform in Player Settings. Unity Render Streaming only supports **ARM64** for Android platform.
Press the **Fix** button to set **Target Architecture** to **ARM64**. | +| **Android Internet Access** | Check **Internet Access** for Android platform in Player Settings. Unity Render Streaming only supports **Required** for Android platform.
Press the **Fix** button to set **Internet Access** to **Required**. | + +## WebApp + +- **Download latest version web app**: Download web application to the specified folder. +- **Show web app documentation**: Open the web page places documentation for web application. +- **Show web app source code**: Open the web page places source code for web application. diff --git a/com.unity.renderstreaming/Editor/AudioStreamReceiverEditor.cs b/com.unity.renderstreaming/Editor/AudioStreamReceiverEditor.cs index f4ce7e361..b84bbd6f0 100644 --- a/com.unity.renderstreaming/Editor/AudioStreamReceiverEditor.cs +++ b/com.unity.renderstreaming/Editor/AudioStreamReceiverEditor.cs @@ -1,6 +1,6 @@ #if UNITY_EDITOR -using UnityEngine; using UnityEditor; +using UnityEngine; namespace Unity.RenderStreaming.Editor { @@ -19,8 +19,8 @@ class Styles void OnEnable() { - m_codec = serializedObject.FindProperty("m_Codec"); - m_targetAudioSource = serializedObject.FindProperty("m_TargetAudioSource"); + m_codec = serializedObject.FindProperty(AudioStreamReceiver.CodecPropertyName); + m_targetAudioSource = serializedObject.FindProperty(AudioStreamReceiver.TargetAudioSourcePropertyName); } void OnDisable() diff --git a/com.unity.renderstreaming/Editor/AudioStreamSenderEditor.cs b/com.unity.renderstreaming/Editor/AudioStreamSenderEditor.cs index 1eb80a722..70848623c 100644 --- a/com.unity.renderstreaming/Editor/AudioStreamSenderEditor.cs +++ b/com.unity.renderstreaming/Editor/AudioStreamSenderEditor.cs @@ -1,8 +1,8 @@ #if UNITY_EDITOR using System; -using UnityEngine; using UnityEditor; using UnityEditor.AnimatedValues; +using UnityEngine; namespace Unity.RenderStreaming.Editor { @@ -26,19 +26,21 @@ class Styles SerializedProperty m_audioListener; SerializedProperty m_microphoneDeviceIndex; SerializedProperty m_autoRequestUserAuthorization; + SerializedProperty m_loopback; SerializedProperty m_bitrate; static AnimBool[] m_sourceFade; void OnEnable() { - m_source = serializedObject.FindProperty("m_Source"); - m_audioSource = serializedObject.FindProperty("m_AudioSource"); - m_audioListener = serializedObject.FindProperty("m_AudioListener"); - m_microphoneDeviceIndex = serializedObject.FindProperty("m_MicrophoneDeviceIndex"); - m_autoRequestUserAuthorization = serializedObject.FindProperty("m_AutoRequestUserAuthorization"); - m_codec = serializedObject.FindProperty("m_Codec"); - m_bitrate = serializedObject.FindProperty("m_Bitrate"); + m_source = serializedObject.FindProperty(AudioStreamSender.SourcePropertyName); + m_audioSource = serializedObject.FindProperty(AudioStreamSender.AudioSourcePropertyName); + m_audioListener = serializedObject.FindProperty(AudioStreamSender.AudioListenerPropertyName); + m_microphoneDeviceIndex = serializedObject.FindProperty(AudioStreamSender.MicrophoneDeviceIndexPropertyName); + m_autoRequestUserAuthorization = serializedObject.FindProperty(AudioStreamSender.AutoRequestUserAuthorizationPropertyName); + m_codec = serializedObject.FindProperty(AudioStreamSender.CodecPropertyName); + m_bitrate = serializedObject.FindProperty(AudioStreamSender.BitratePropertyName); + m_loopback = serializedObject.FindProperty(AudioStreamSender.LoopbackPropertyName); if (m_sourceFade == null) { @@ -74,6 +76,13 @@ public override void OnInspectorGUI() EditorGUILayout.PropertyField(m_codec); } + EditorGUILayout.Space(); + EditorGUILayout.PropertyField(m_loopback); + if (target is AudioStreamSender sender && sender.isPlaying) + { + sender.loopback = m_loopback.boolValue; + } + EditorGUILayout.Space(); EditorGUILayout.PropertyField(m_bitrate, s_Styles.bitrateContent); diff --git a/com.unity.renderstreaming/Editor/ConfigInfoLine.cs b/com.unity.renderstreaming/Editor/ConfigInfoLine.cs new file mode 100644 index 000000000..da3eba3a5 --- /dev/null +++ b/com.unity.renderstreaming/Editor/ConfigInfoLine.cs @@ -0,0 +1,111 @@ +using System; +using UnityEditor; +using UnityEngine; +using UnityEngine.UIElements; + +namespace Unity.RenderStreaming.Editor +{ + internal class ConfigInfoLine : VisualElement + { + static class Style + { + const string k_IconFolder = "Packages/com.unity.renderstreaming/Editor/Icon/"; + public static readonly Texture ok = EditorGUIUtility.Load(k_IconFolder + "OK.png") as Texture; + public static readonly Texture error = EditorGUIUtility.Load(k_IconFolder + "Error.png") as Texture; + } + + private readonly bool m_visibleStatus; + private readonly bool m_skipErrorIcon; + private Func m_tester; + private Func m_dependTester; + private bool m_haveFixer; + private bool m_currentStatus; + private bool m_dependStatus; + + public ConfigInfoLine( + string label, + string error, + MessageType messageType, + string resolverButtonLabel, + Func tester, + Action resolver, + Func dependTester = null, + bool visibleStatus = true, + bool skipErrorIcon = false + ) + { + m_visibleStatus = visibleStatus; + m_skipErrorIcon = skipErrorIcon; + m_tester = tester; + m_haveFixer = resolver != null; + m_dependTester = dependTester; + + var testLabel = new Label(label) { name = "testLabel" }; + var fixer = new Button(resolver) { text = resolverButtonLabel, name = "resolver" }; + var testRow = new VisualElement() { name = "testRow" }; + testRow.Add(testLabel); + if (m_visibleStatus) + { + var statusOk = new Image { image = Style.ok, name = "statusOK" }; + var statusError = new Image { image = Style.error, name = "statusError" }; + testRow.Add(statusOk); + testRow.Add(statusError); + } + + testRow.Add(fixer); + + Add(testRow); + HelpBoxMessageType kind; + switch (messageType) + { + default: + case MessageType.None: + kind = HelpBoxMessageType.None; + break; + case MessageType.Error: + kind = HelpBoxMessageType.Error; + break; + case MessageType.Warning: + kind = HelpBoxMessageType.Warning; + break; + case MessageType.Info: + kind = HelpBoxMessageType.Info; + break; + } + + Add(new HelpBox(error, kind)); + + UpdateDisplay(m_currentStatus, m_haveFixer, m_dependStatus); + } + + public void CheckUpdate() + { + bool wellConfigured = m_tester(); + bool wellDependConfigured = m_dependTester == null || m_dependTester(); + bool changeConfigured = wellConfigured ^ m_currentStatus; + bool changeDependConfigured = wellDependConfigured ^ m_dependStatus; + if (changeConfigured || changeDependConfigured) + { + UpdateDisplay(wellConfigured, m_haveFixer, wellDependConfigured); + m_currentStatus = wellConfigured; + m_dependStatus = wellDependConfigured; + } + } + + private void UpdateDisplay(bool statusOK, bool haveFixer, bool dependStatusOK) + { + if (m_visibleStatus) + { + this.Q(name: "statusOK").style.display = statusOK ? DisplayStyle.Flex : DisplayStyle.None; + this.Q(name: "statusError").style.display = !statusOK + ? (m_skipErrorIcon ? DisplayStyle.None : DisplayStyle.Flex) + : DisplayStyle.None; + } + + var resolver = this.Q