diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml index 654887c..8c7e628 100644 --- a/.github/workflows/test.yml +++ b/.github/workflows/test.yml @@ -35,5 +35,3 @@ jobs: run: | source $HOME/.bash_profile magic run tests - magic run benchmarks - magic run examples diff --git a/magic.lock b/magic.lock index 0f0b1c6..3ce03dc 100644 --- a/magic.lock +++ b/magic.lock @@ -4,821 +4,3931 @@ environments: channels: - url: https://conda.anaconda.org/conda-forge/ - url: https://conda.modular.com/max/ - - url: file:///Users/mikhailtavarez/.rattler/output/ + - url: https://repo.prefix.dev/mojo-community/ packages: osx-arm64: + - conda: https://conda.anaconda.org/conda-forge/noarch/aiohappyeyeballs-2.4.4-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/aiohttp-3.11.11-py312h998013c_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/aiosignal-1.3.2-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/annotated-types-0.7.0-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/anyio-4.7.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/attrs-24.3.0-pyh71513ae_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/aws-c-auth-0.8.0-h8bc59a9_15.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/aws-c-cal-0.8.1-hc8a0bd2_3.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/aws-c-common-0.10.6-h5505292_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/aws-c-compression-0.3.0-hc8a0bd2_5.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/aws-c-event-stream-0.5.0-h54f970a_11.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/aws-c-http-0.9.2-h96aa502_4.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/aws-c-io-0.15.3-haba67d1_5.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/aws-c-mqtt-0.11.0-h24f418c_12.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/aws-c-s3-0.7.7-h1be5864_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/aws-c-sdkutils-0.2.1-hc8a0bd2_4.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/aws-checksums-0.2.2-hc8a0bd2_4.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/aws-crt-cpp-0.29.7-h19a973c_7.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/aws-sdk-cpp-1.11.458-he0ff2e4_4.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/azure-core-cpp-1.14.0-hd50102c_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/azure-identity-cpp-1.10.0-hc602bab_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/azure-storage-blobs-cpp-12.13.0-h7585a09_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/azure-storage-common-cpp-12.8.0-h9ca1f76_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/azure-storage-files-datalake-cpp-12.12.0-hcdd55da_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/backoff-2.2.1-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/brotli-python-1.1.0-py312hde4cb15_2.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/bzip2-1.0.8-h99b78c6_7.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/ca-certificates-2024.8.30-hf0a4a13_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/click-8.1.7-unix_pyh707e725_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/importlib-metadata-8.5.0-pyha770c72_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/importlib_metadata-8.5.0-hd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/jupyter_client-8.6.2-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/jupyter_core-5.7.2-py312h81bd7bf_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/c-ares-1.34.4-h5505292_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/ca-certificates-2024.12.14-hf0a4a13_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/certifi-2024.12.14-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/cffi-1.17.1-py312h0fad829_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/charset-normalizer-3.4.1-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/click-8.1.8-pyh707e725_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/colorama-0.4.6-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/datasets-2.14.4-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/deprecated-1.2.15-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/dill-0.3.7-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/dnspython-2.7.0-pyhff2d567_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/email-validator-2.2.0-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/email_validator-2.2.0-hd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/exceptiongroup-1.2.2-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/fastapi-0.115.6-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/fastapi-cli-0.0.7-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/filelock-3.16.1-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/freetype-2.12.1-hadb7bae_2.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/frozenlist-1.5.0-py312h0bf5046_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/fsspec-2024.12.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/gflags-2.2.2-hf9b8971_1005.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/glog-0.7.1-heb240a5_0.conda + - conda: https://repo.prefix.dev/mojo-community/osx-arm64/gojo-0.1.13-h60d57d3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/googleapis-common-protos-1.66.0-pyhff2d567_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/h11-0.14.0-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/h2-4.1.0-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/hpack-4.0.0-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/httpcore-1.0.7-pyh29332c3_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/httptools-0.6.4-py312hea69d52_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/httpx-0.28.1-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/huggingface_hub-0.26.5-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/hyperframe-6.0.1-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/icu-75.1-hfee45f7_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/idna-3.10-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/importlib-metadata-8.5.0-pyha770c72_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/jinja2-3.1.5-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/jupyter_client-8.6.3-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/jupyter_core-5.7.2-pyh31011fe_1.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/krb5-1.21.3-h237132a_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libblas-3.9.0-23_osxarm64_openblas.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libcblas-3.9.0-23_osxarm64_openblas.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libcxx-18.1.8-h3ed4263_7.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/lcms2-2.16-ha0e7c42_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/lerc-4.0.0-h9a09cb3_0.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libabseil-20240722.0-cxx17_h07bc746_4.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libarrow-18.1.0-h0ad35bc_7_cpu.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libarrow-acero-18.1.0-hf07054f_7_cpu.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libarrow-dataset-18.1.0-hf07054f_7_cpu.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libarrow-substrait-18.1.0-h4239455_7_cpu.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libblas-3.9.0-26_osxarm64_openblas.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libbrotlicommon-1.1.0-hd74edd7_2.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libbrotlidec-1.1.0-hd74edd7_2.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libbrotlienc-1.1.0-hd74edd7_2.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libcblas-3.9.0-26_osxarm64_openblas.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libcrc32c-1.1.2-hbdafb3b_0.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libcurl-8.11.1-h73640d1_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libcxx-19.1.6-ha82da77_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libdeflate-1.23-hec38601_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libedit-3.1.20191231-hc8eb9b7_2.tar.bz2 - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libexpat-2.6.3-hf9b8971_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libev-4.33-h93a5062_2.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libevent-2.1.12-h2757513_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libexpat-2.6.4-h286801f_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libffi-3.4.2-h3422bc3_5.tar.bz2 - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libgfortran-5.0.0-13_2_0_hd922786_3.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libgfortran5-13.2.0-hf226fd6_3.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/liblapack-3.9.0-23_osxarm64_openblas.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libopenblas-0.3.27-openmp_h517c56d_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libgoogle-cloud-2.33.0-hdbe95d5_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libgoogle-cloud-storage-2.33.0-h7081f7f_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libgrpc-1.67.1-h0a426d6_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libiconv-1.17-h0d3ecfb_2.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libjpeg-turbo-3.0.0-hb547adb_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/liblapack-3.9.0-26_osxarm64_openblas.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/liblzma-5.6.3-h39f12f2_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libnghttp2-1.64.0-h6d7220d_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libopenblas-0.3.28-openmp_hf332438_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libparquet-18.1.0-h636d7b7_7_cpu.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libpng-1.6.44-hc14010f_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libprotobuf-5.28.3-h3bd63a1_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libre2-11-2024.07.02-h07bc746_2.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libsodium-1.0.20-h99b78c6_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libsqlite-3.46.1-hc14010f_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libzlib-1.3.1-hfb2fe0b_1.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/llvm-openmp-18.1.8-hde57baf_1.conda - - conda: https://conda.modular.com/max/noarch/max-24.5.0-release.conda - - conda: https://conda.modular.com/max/osx-arm64/max-core-24.5.0-release.conda - - conda: https://conda.modular.com/max/osx-arm64/max-python-24.5.0-3.12release.conda - - conda: https://conda.modular.com/max/noarch/mblack-24.5.0-release.conda - - conda: https://conda.modular.com/max/noarch/mojo-jupyter-24.5.0-release.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/mypy_extensions-1.0.0-pyha770c72_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libsqlite-3.47.2-h3f77e49_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libssh2-1.11.1-h9cc3647_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libthrift-0.21.0-h64651cc_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libtiff-4.7.0-h551f018_3.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libutf8proc-2.9.0-h5505292_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libuv-1.49.2-h7ab814d_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libwebp-base-1.5.0-h2471fea_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libxcb-1.17.0-hdb1d25a_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libxml2-2.13.5-h178c5d8_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libzlib-1.3.1-h8359307_2.conda + - conda: https://repo.prefix.dev/mojo-community/osx-arm64/lightbug_http-0.1.6-h60d57d3_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/llvm-openmp-19.1.6-hdb05f8b_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/lz4-c-1.10.0-h286801f_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/markdown-it-py-3.0.0-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/markupsafe-3.0.2-py312h998013c_1.conda + - conda: https://conda.modular.com/max/noarch/max-24.6.0-release.conda + - conda: https://conda.modular.com/max/osx-arm64/max-core-24.6.0-release.conda + - conda: https://conda.modular.com/max/osx-arm64/max-python-24.6.0-3.12release.conda + - conda: https://conda.modular.com/max/noarch/mblack-24.6.0-release.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/mdurl-0.1.2-pyhd8ed1ab_1.conda + - conda: https://conda.modular.com/max/noarch/mojo-jupyter-24.6.0-release.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/multidict-6.1.0-py312hdb8e49c_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/multiprocess-0.70.15-py312h02f2b3b_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/mypy_extensions-1.0.0-pyha770c72_1.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/ncurses-6.5-h7bae524_1.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/numpy-1.26.4-py312h8442bc7_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/openssl-3.3.2-h8359307_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/packaging-24.1-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/pathspec-0.12.1-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/platformdirs-4.3.3-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/python-3.12.6-h739c21a_0_cpython.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/python-dateutil-2.9.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/openjpeg-2.5.3-h8a3d83b_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/openssl-3.4.0-h81ee809_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/opentelemetry-api-1.29.0-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/opentelemetry-exporter-otlp-proto-common-1.29.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/opentelemetry-exporter-otlp-proto-http-1.29.0-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/opentelemetry-exporter-prometheus-1.12.0rc1-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/opentelemetry-proto-1.29.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/opentelemetry-sdk-1.29.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/opentelemetry-semantic-conventions-0.50b0-pyh3cfb1c2_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/orc-2.0.3-h0ff2369_2.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/packaging-24.2-pyhd8ed1ab_2.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/pandas-2.2.3-py312hcd31e36_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pathspec-0.12.1-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/pillow-11.1.0-py312h50aef2c_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/platformdirs-4.3.6-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/prometheus_client-0.21.1-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/propcache-0.2.1-py312hea69d52_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/protobuf-5.28.3-py312hd8f9ff3_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/pthread-stubs-0.4-hd74edd7_1002.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/pyarrow-18.1.0-py312h1f38498_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/pyarrow-core-18.1.0-py312hc40f475_0_cpu.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pycparser-2.22-pyh29332c3_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pydantic-2.10.4-pyh3cfb1c2_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/pydantic-core-2.27.2-py312hcd83bfe_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pydantic-settings-2.7.1-pyh3cfb1c2_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pygments-2.18.0-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/pyinstrument-5.0.0-py312h0bf5046_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pysocks-1.7.1-pyha55dd90_7.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/python-3.12.8-hc22306f_1_cpython.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/python-dateutil-2.9.0.post0-pyhff2d567_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/python-dotenv-1.0.1-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/python-json-logger-2.0.7-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/python-multipart-0.0.20-pyhff2d567_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/python-tzdata-2024.2-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/python-xxhash-3.5.0-py312h024a12e_1.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/python_abi-3.12-5_cp312.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/pyzmq-26.2.0-py312hc6335d2_2.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pytz-2024.1-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/pyyaml-6.0.2-py312h024a12e_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/pyzmq-26.2.0-py312hf8a1cbd_3.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/re2-2024.07.02-h6589ca4_2.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/readline-8.2-h92ec313_1.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/six-1.16.0-pyh6c4a22f_0.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/regex-2024.11.6-py312hea69d52_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/requests-2.32.3-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/rich-13.9.4-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/rich-toolkit-0.11.3-pyh29332c3_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/safetensors-0.5.0-py312hcd83bfe_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/shellingham-1.5.4-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/six-1.17.0-pyhd8ed1ab_0.conda + - conda: https://repo.prefix.dev/mojo-community/osx-arm64/small_time-0.1.3-h60d57d3_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/snappy-1.2.1-h98b9ce2_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/sniffio-1.3.1-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/sse-starlette-2.2.1-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/starlette-0.41.3-pyha770c72_1.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/tk-8.6.13-h5083fa2_1.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/tornado-6.4.1-py312h024a12e_1.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/traitlets-5.14.3-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/tzdata-2024a-h8827d51_1.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/xz-5.2.6-h57fd34a_0.tar.bz2 - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/zeromq-4.3.5-h64debc3_5.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/zipp-3.20.2-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/tokenizers-0.21.0-py312hf3e4074_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/tornado-6.4.2-py312hea69d52_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/tqdm-4.67.1-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/traitlets-5.14.3-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/transformers-4.47.1-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/typer-0.15.1-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/typer-slim-0.15.1-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/typer-slim-standard-0.15.1-hd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/typing-extensions-4.12.2-hd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/typing_extensions-4.12.2-pyha770c72_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/tzdata-2024b-hc8b5060_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/urllib3-2.3.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/uvicorn-0.34.0-pyh31011fe_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/uvicorn-standard-0.34.0-h31011fe_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/uvloop-0.21.0-py312h0bf5046_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/watchfiles-1.0.3-py312hcd83bfe_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/websockets-14.1-py312hea69d52_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/wrapt-1.17.0-py312hea69d52_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/xorg-libxau-1.0.12-h5505292_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/xorg-libxdmcp-1.1.5-hd74edd7_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/xxhash-0.8.2-hb547adb_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/yaml-0.2.5-h3422bc3_2.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/yarl-1.18.3-py312hea69d52_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/zeromq-4.3.5-hc1bb282_7.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/zipp-3.21.0-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/zstandard-0.23.0-py312h15fbf35_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/zstd-1.5.6-hb46c0d2_0.conda packages: - kind: conda - name: bzip2 - version: 1.0.8 - build: h99b78c6_7 - build_number: 7 - subdir: osx-arm64 - url: https://conda.anaconda.org/conda-forge/osx-arm64/bzip2-1.0.8-h99b78c6_7.conda - sha256: adfa71f158cbd872a36394c56c3568e6034aa55c623634b37a4836bd036e6b91 - md5: fc6948412dbbbe9a4c9ddbbcfe0a79ab + name: aiohappyeyeballs + version: 2.4.4 + build: pyhd8ed1ab_1 + build_number: 1 + subdir: noarch + noarch: python + url: https://conda.anaconda.org/conda-forge/noarch/aiohappyeyeballs-2.4.4-pyhd8ed1ab_1.conda + sha256: 95d4713e49ea92ae50cf42393683ede706b7875af5f7cb14c253438180afa732 + md5: 296b403617bafa89df4971567af79013 depends: - - __osx >=11.0 - license: bzip2-1.0.6 - license_family: BSD - size: 122909 - timestamp: 1720974522888 + - python >=3.9 + license: PSF-2.0 + license_family: PSF + size: 19351 + timestamp: 1733332029649 - kind: conda - name: ca-certificates - version: 2024.8.30 - build: hf0a4a13_0 + name: aiohttp + version: 3.11.11 + build: py312h998013c_0 subdir: osx-arm64 - url: https://conda.anaconda.org/conda-forge/osx-arm64/ca-certificates-2024.8.30-hf0a4a13_0.conda - sha256: 2db1733f4b644575dbbdd7994a8f338e6ef937f5ebdb74acd557e9dda0211709 - md5: 40dec13fd8348dbe303e57be74bd3d35 - license: ISC - size: 158482 - timestamp: 1725019034582 -- kind: conda - name: click - version: 8.1.7 - build: unix_pyh707e725_0 - subdir: noarch - noarch: python - url: https://conda.anaconda.org/conda-forge/noarch/click-8.1.7-unix_pyh707e725_0.conda - sha256: f0016cbab6ac4138a429e28dbcb904a90305b34b3fe41a9b89d697c90401caec - md5: f3ad426304898027fc619827ff428eca + url: https://conda.anaconda.org/conda-forge/osx-arm64/aiohttp-3.11.11-py312h998013c_0.conda + sha256: 446f078e7a7b892894d7f4851a278b7834ffb4f5632313646a55c3abe13690d4 + md5: c69c904691364cfb27d15aa7153e9c29 depends: - - __unix - - python >=3.8 - license: BSD-3-Clause - license_family: BSD - size: 84437 - timestamp: 1692311973840 + - __osx >=11.0 + - aiohappyeyeballs >=2.3.0 + - aiosignal >=1.1.2 + - attrs >=17.3.0 + - frozenlist >=1.1.1 + - multidict >=4.5,<7.0 + - propcache >=0.2.0 + - python >=3.12,<3.13.0a0 + - python >=3.12,<3.13.0a0 *_cpython + - python_abi 3.12.* *_cp312 + - yarl >=1.17.0,<2.0 + license: MIT AND Apache-2.0 + license_family: Apache + size: 875711 + timestamp: 1734597277258 - kind: conda - name: importlib-metadata - version: 8.5.0 - build: pyha770c72_0 + name: aiosignal + version: 1.3.2 + build: pyhd8ed1ab_0 subdir: noarch noarch: python - url: https://conda.anaconda.org/conda-forge/noarch/importlib-metadata-8.5.0-pyha770c72_0.conda - sha256: 7194700ce1a5ad2621fd68e894dd8c1ceaff9a38723e6e0e5298fdef13017b1c - md5: 54198435fce4d64d8a89af22573012a8 + url: https://conda.anaconda.org/conda-forge/noarch/aiosignal-1.3.2-pyhd8ed1ab_0.conda + sha256: 7de8ced1918bbdadecf8e1c1c68237fe5709c097bd9e0d254f4cad118f4345d0 + md5: 1a3981115a398535dbe3f6d5faae3d36 depends: - - python >=3.8 - - zipp >=0.5 + - frozenlist >=1.1.0 + - python >=3.9 license: Apache-2.0 license_family: APACHE - size: 28646 - timestamp: 1726082927916 + size: 13229 + timestamp: 1734342253061 - kind: conda - name: importlib_metadata - version: 8.5.0 - build: hd8ed1ab_0 + name: annotated-types + version: 0.7.0 + build: pyhd8ed1ab_1 + build_number: 1 subdir: noarch - noarch: generic - url: https://conda.anaconda.org/conda-forge/noarch/importlib_metadata-8.5.0-hd8ed1ab_0.conda - sha256: 313b8a05211bacd6b15ab2621cb73d7f41ea5c6cae98db53367d47833f03fef1 - md5: 2a92e152208121afadf85a5e1f3a5f4d + noarch: python + url: https://conda.anaconda.org/conda-forge/noarch/annotated-types-0.7.0-pyhd8ed1ab_1.conda + sha256: e0ea1ba78fbb64f17062601edda82097fcf815012cf52bb704150a2668110d48 + md5: 2934f256a8acfe48f6ebb4fce6cde29c depends: - - importlib-metadata >=8.5.0,<8.5.1.0a0 - license: Apache-2.0 - license_family: APACHE - size: 9385 - timestamp: 1726082930346 + - python >=3.9 + - typing-extensions >=4.0.0 + license: MIT + license_family: MIT + size: 18074 + timestamp: 1733247158254 - kind: conda - name: jupyter_client - version: 8.6.2 + name: anyio + version: 4.7.0 build: pyhd8ed1ab_0 subdir: noarch noarch: python - url: https://conda.anaconda.org/conda-forge/noarch/jupyter_client-8.6.2-pyhd8ed1ab_0.conda - sha256: 634f065cdd1d0aacd4bb6848ebf240dcebc8578135d65f4ad4aa42b2276c4e0c - md5: 3cdbb2fa84490e5fd44c9f9806c0d292 + url: https://conda.anaconda.org/conda-forge/noarch/anyio-4.7.0-pyhd8ed1ab_0.conda + sha256: 687537ee3af30f8784986bf40cac30e88138770b16e51ca9850c9c23c09aeba1 + md5: c88107912954a983c2caf25f7fd55158 depends: - - importlib_metadata >=4.8.3 - - jupyter_core >=4.12,!=5.0.* - - python >=3.8 - - python-dateutil >=2.8.2 - - pyzmq >=23.0 - - tornado >=6.2 - - traitlets >=5.3 - license: BSD-3-Clause - license_family: BSD - size: 106248 - timestamp: 1716472312833 + - exceptiongroup >=1.0.2 + - idna >=2.8 + - python >=3.9 + - sniffio >=1.1 + - typing_extensions >=4.5 + constrains: + - trio >=0.26.1 + - uvloop >=0.21 + license: MIT + license_family: MIT + size: 112730 + timestamp: 1733532678437 - kind: conda - name: jupyter_core - version: 5.7.2 - build: py312h81bd7bf_0 - subdir: osx-arm64 - url: https://conda.anaconda.org/conda-forge/osx-arm64/jupyter_core-5.7.2-py312h81bd7bf_0.conda - sha256: 5ab0e75a30915d34ae27b4a76f1241c2f4cc4419b6b1c838cc1160b9ec8bfaf5 - md5: 209b9cb7159212afce5e16d7a3ee3b47 + name: attrs + version: 24.3.0 + build: pyh71513ae_0 + subdir: noarch + noarch: python + url: https://conda.anaconda.org/conda-forge/noarch/attrs-24.3.0-pyh71513ae_0.conda + sha256: 750186af694a7130eaf7119fbb56db0d2326d8995ad5b8eae23c622b85fea29a + md5: 356927ace43302bf6f5926e2a58dae6a depends: - - platformdirs >=2.5 - - python >=3.12,<3.13.0a0 - - python >=3.12,<3.13.0a0 *_cpython - - python_abi 3.12.* *_cp312 - - traitlets >=5.3 - license: BSD-3-Clause - license_family: BSD - size: 93829 - timestamp: 1710257916303 + - python >=3.9 + license: MIT + license_family: MIT + size: 56354 + timestamp: 1734348889193 - kind: conda - name: krb5 - version: 1.21.3 - build: h237132a_0 + name: aws-c-auth + version: 0.8.0 + build: h8bc59a9_15 + build_number: 15 subdir: osx-arm64 - url: https://conda.anaconda.org/conda-forge/osx-arm64/krb5-1.21.3-h237132a_0.conda - sha256: 4442f957c3c77d69d9da3521268cad5d54c9033f1a73f99cde0a3658937b159b - md5: c6dc8a0fdec13a0565936655c33069a1 + url: https://conda.anaconda.org/conda-forge/osx-arm64/aws-c-auth-0.8.0-h8bc59a9_15.conda + sha256: 0e41e56b662e76e024182adebcd91d09a4d38a83b35217c84e4967354dfff9a2 + md5: f688b8893c20ad9477a19e7ce614014a depends: - __osx >=11.0 - - libcxx >=16 - - libedit >=3.1.20191231,<3.2.0a0 - - libedit >=3.1.20191231,<4.0a0 - - openssl >=3.3.1,<4.0a0 - license: MIT - license_family: MIT - size: 1155530 - timestamp: 1719463474401 + - aws-c-cal >=0.8.1,<0.8.2.0a0 + - aws-c-common >=0.10.6,<0.10.7.0a0 + - aws-c-http >=0.9.2,<0.9.3.0a0 + - aws-c-io >=0.15.3,<0.15.4.0a0 + - aws-c-sdkutils >=0.2.1,<0.2.2.0a0 + license: Apache-2.0 + license_family: Apache + size: 92507 + timestamp: 1734021831330 - kind: conda - name: libblas - version: 3.9.0 - build: 23_osxarm64_openblas - build_number: 23 + name: aws-c-cal + version: 0.8.1 + build: hc8a0bd2_3 + build_number: 3 subdir: osx-arm64 - url: https://conda.anaconda.org/conda-forge/osx-arm64/libblas-3.9.0-23_osxarm64_openblas.conda - sha256: 1c30da861e306a25fac8cd30ce0c1b31c9238d04e7768c381cf4d431b4361e6c - md5: acae9191e8772f5aff48ab5232d4d2a3 + url: https://conda.anaconda.org/conda-forge/osx-arm64/aws-c-cal-0.8.1-hc8a0bd2_3.conda + sha256: 1f44be36e1daa17b4b081debb8aee492d13571084f38b503ad13e869fef24fe4 + md5: 8b0ce61384e5a33d2b301a64f3d22ac5 depends: - - libopenblas >=0.3.27,<0.3.28.0a0 - - libopenblas >=0.3.27,<1.0a0 - constrains: - - liblapack 3.9.0 23_osxarm64_openblas - - blas * openblas - - liblapacke 3.9.0 23_osxarm64_openblas - - libcblas 3.9.0 23_osxarm64_openblas - license: BSD-3-Clause - license_family: BSD - size: 15103 - timestamp: 1721688997980 + - __osx >=11.0 + - aws-c-common >=0.10.6,<0.10.7.0a0 + - openssl >=3.3.1,<4.0a0 + license: Apache-2.0 + license_family: Apache + size: 39925 + timestamp: 1733991649383 - kind: conda - name: libcblas - version: 3.9.0 - build: 23_osxarm64_openblas - build_number: 23 + name: aws-c-common + version: 0.10.6 + build: h5505292_0 subdir: osx-arm64 - url: https://conda.anaconda.org/conda-forge/osx-arm64/libcblas-3.9.0-23_osxarm64_openblas.conda - sha256: c39d944909d0608bd0333398be5e0051045c9451bfd6cc6320732d33375569c8 - md5: bad6ee9b7d5584efc2bc5266137b5f0d + url: https://conda.anaconda.org/conda-forge/osx-arm64/aws-c-common-0.10.6-h5505292_0.conda + sha256: 3bde135c8e74987c0f79ecd4fa17ec9cff0d658b3090168727ca1af3815ae57a + md5: 145e5b4c9702ed279d7d68aaf096f77d depends: - - libblas 3.9.0 23_osxarm64_openblas - constrains: - - liblapack 3.9.0 23_osxarm64_openblas - - liblapacke 3.9.0 23_osxarm64_openblas - - blas * openblas - license: BSD-3-Clause - license_family: BSD - size: 14991 - timestamp: 1721689017803 + - __osx >=11.0 + license: Apache-2.0 + license_family: Apache + size: 221863 + timestamp: 1733975576886 - kind: conda - name: libcxx - version: 18.1.8 - build: h3ed4263_7 - build_number: 7 + name: aws-c-compression + version: 0.3.0 + build: hc8a0bd2_5 + build_number: 5 subdir: osx-arm64 - url: https://conda.anaconda.org/conda-forge/osx-arm64/libcxx-18.1.8-h3ed4263_7.conda - sha256: 15b4abaa249f0965ce42aeb4a1a2b1b5df9a1f402e7c5bd8156272fd6cad2878 - md5: e0e7d9a2ec0f9509ffdfd5f48da522fb + url: https://conda.anaconda.org/conda-forge/osx-arm64/aws-c-compression-0.3.0-hc8a0bd2_5.conda + sha256: 47b2813f652ce7e64ac442f771b2a5f7d4af4ad0d07ff51f6075ea80ed2e3f09 + md5: a8b6c17732d14ed49d0e9b59c43186bc depends: - __osx >=11.0 - license: Apache-2.0 WITH LLVM-exception + - aws-c-common >=0.10.6,<0.10.7.0a0 + license: Apache-2.0 license_family: Apache - size: 436921 - timestamp: 1725403628507 + size: 18068 + timestamp: 1733991869211 - kind: conda - name: libedit - version: 3.1.20191231 - build: hc8eb9b7_2 - build_number: 2 + name: aws-c-event-stream + version: 0.5.0 + build: h54f970a_11 + build_number: 11 subdir: osx-arm64 - url: https://conda.anaconda.org/conda-forge/osx-arm64/libedit-3.1.20191231-hc8eb9b7_2.tar.bz2 - sha256: 3912636197933ecfe4692634119e8644904b41a58f30cad9d1fc02f6ba4d9fca - md5: 30e4362988a2623e9eb34337b83e01f9 + url: https://conda.anaconda.org/conda-forge/osx-arm64/aws-c-event-stream-0.5.0-h54f970a_11.conda + sha256: f0667935f4e0d4c25e0e51da035640310b5ceeb8f723156734439bde8b848d7d + md5: ba41238f8e653998d7d2f42e3a8db054 depends: - - ncurses >=6.2,<7.0.0a0 - license: BSD-2-Clause - license_family: BSD - size: 96607 - timestamp: 1597616630749 + - __osx >=11.0 + - aws-c-common >=0.10.6,<0.10.7.0a0 + - aws-c-io >=0.15.3,<0.15.4.0a0 + - aws-checksums >=0.2.2,<0.2.3.0a0 + - libcxx >=18 + license: Apache-2.0 + license_family: Apache + size: 47078 + timestamp: 1734024749727 - kind: conda - name: libexpat - version: 2.6.3 - build: hf9b8971_0 + name: aws-c-http + version: 0.9.2 + build: h96aa502_4 + build_number: 4 subdir: osx-arm64 - url: https://conda.anaconda.org/conda-forge/osx-arm64/libexpat-2.6.3-hf9b8971_0.conda - sha256: 5cbe5a199fba14ade55457a468ce663aac0b54832c39aa54470b3889b4c75c4a - md5: 5f22f07c2ab2dea8c66fe9585a062c96 + url: https://conda.anaconda.org/conda-forge/osx-arm64/aws-c-http-0.9.2-h96aa502_4.conda + sha256: 22e4737c8a885995b7c1ae1d79c1f6e78d489e16ec079615980fdde067aeaf76 + md5: 495c93a4f08b17deb3c04894512330e6 depends: - __osx >=11.0 - constrains: - - expat 2.6.3.* - license: MIT - license_family: MIT - size: 63895 - timestamp: 1725568783033 + - aws-c-cal >=0.8.1,<0.8.2.0a0 + - aws-c-common >=0.10.6,<0.10.7.0a0 + - aws-c-compression >=0.3.0,<0.3.1.0a0 + - aws-c-io >=0.15.3,<0.15.4.0a0 + license: Apache-2.0 + license_family: Apache + size: 152983 + timestamp: 1734008451473 - kind: conda - name: libffi - version: 3.4.2 - build: h3422bc3_5 + name: aws-c-io + version: 0.15.3 + build: haba67d1_5 build_number: 5 subdir: osx-arm64 - url: https://conda.anaconda.org/conda-forge/osx-arm64/libffi-3.4.2-h3422bc3_5.tar.bz2 - sha256: 41b3d13efb775e340e4dba549ab5c029611ea6918703096b2eaa9c015c0750ca - md5: 086914b672be056eb70fd4285b6783b6 - license: MIT - license_family: MIT - size: 39020 - timestamp: 1636488587153 + url: https://conda.anaconda.org/conda-forge/osx-arm64/aws-c-io-0.15.3-haba67d1_5.conda + sha256: c0a1a2b0750225ac3dc07fd258c88c2be866bf8ac67ba3d50bb4ecec852ff8ee + md5: 4c5ff4134e76426a75b8c548984fa933 + depends: + - __osx >=11.0 + - aws-c-cal >=0.8.1,<0.8.2.0a0 + - aws-c-common >=0.10.6,<0.10.7.0a0 + license: Apache-2.0 + license_family: Apache + size: 135729 + timestamp: 1734433832730 - kind: conda - name: libgfortran - version: 5.0.0 - build: 13_2_0_hd922786_3 - build_number: 3 + name: aws-c-mqtt + version: 0.11.0 + build: h24f418c_12 + build_number: 12 subdir: osx-arm64 - url: https://conda.anaconda.org/conda-forge/osx-arm64/libgfortran-5.0.0-13_2_0_hd922786_3.conda - sha256: 44e541b4821c96b28b27fef5630883a60ce4fee91fd9c79f25a199f8f73f337b - md5: 4a55d9e169114b2b90d3ec4604cd7bbf + url: https://conda.anaconda.org/conda-forge/osx-arm64/aws-c-mqtt-0.11.0-h24f418c_12.conda + sha256: 96575ea1dd2a9ea94763882e40a66dcbff9c41f702bf37c9514c4c719b3c11dd + md5: c072045a6206f88015d02fcba1705ea1 depends: - - libgfortran5 13.2.0 hf226fd6_3 - license: GPL-3.0-only WITH GCC-exception-3.1 - license_family: GPL - size: 110233 - timestamp: 1707330749033 + - __osx >=11.0 + - aws-c-common >=0.10.6,<0.10.7.0a0 + - aws-c-http >=0.9.2,<0.9.3.0a0 + - aws-c-io >=0.15.3,<0.15.4.0a0 + license: Apache-2.0 + license_family: Apache + size: 134371 + timestamp: 1734025379525 - kind: conda - name: libgfortran5 - version: 13.2.0 - build: hf226fd6_3 - build_number: 3 + name: aws-c-s3 + version: 0.7.7 + build: h1be5864_0 subdir: osx-arm64 - url: https://conda.anaconda.org/conda-forge/osx-arm64/libgfortran5-13.2.0-hf226fd6_3.conda - sha256: bafc679eedb468a86aa4636061c55966186399ee0a04b605920d208d97ac579a - md5: 66ac81d54e95c534ae488726c1f698ea + url: https://conda.anaconda.org/conda-forge/osx-arm64/aws-c-s3-0.7.7-h1be5864_0.conda + sha256: 22966164d63808689fffd35945f57756c95337327e28099b5d77b29fc6a56ecc + md5: a37bba7acb62dd70492ee01eacca3b8f depends: - - llvm-openmp >=8.0.0 - constrains: - - libgfortran 5.0.0 13_2_0_*_3 - license: GPL-3.0-only WITH GCC-exception-3.1 - license_family: GPL - size: 997381 - timestamp: 1707330687590 + - __osx >=11.0 + - aws-c-auth >=0.8.0,<0.8.1.0a0 + - aws-c-cal >=0.8.1,<0.8.2.0a0 + - aws-c-common >=0.10.6,<0.10.7.0a0 + - aws-c-http >=0.9.2,<0.9.3.0a0 + - aws-c-io >=0.15.3,<0.15.4.0a0 + - aws-checksums >=0.2.2,<0.2.3.0a0 + license: Apache-2.0 + license_family: Apache + size: 97598 + timestamp: 1734146239038 - kind: conda - name: liblapack - version: 3.9.0 - build: 23_osxarm64_openblas - build_number: 23 + name: aws-c-sdkutils + version: 0.2.1 + build: hc8a0bd2_4 + build_number: 4 subdir: osx-arm64 - url: https://conda.anaconda.org/conda-forge/osx-arm64/liblapack-3.9.0-23_osxarm64_openblas.conda - sha256: 13799a137ffc80786725e7e2820d37d4c0d59dbb76013a14c21771415b0a4263 - md5: 754ef44f72ab80fd14eaa789ac393a27 + url: https://conda.anaconda.org/conda-forge/osx-arm64/aws-c-sdkutils-0.2.1-hc8a0bd2_4.conda + sha256: de98343ce42d2e569b3380292d20f47bf39bda08aadabcbb8e650d3f38fd742f + md5: 22f72f8cd7ead211304ac17d337d96e0 depends: - - libblas 3.9.0 23_osxarm64_openblas - constrains: - - blas * openblas - - liblapacke 3.9.0 23_osxarm64_openblas - - libcblas 3.9.0 23_osxarm64_openblas - license: BSD-3-Clause - license_family: BSD - size: 14999 - timestamp: 1721689026268 + - __osx >=11.0 + - aws-c-common >=0.10.6,<0.10.7.0a0 + license: Apache-2.0 + license_family: Apache + size: 49664 + timestamp: 1733994553014 - kind: conda - name: libopenblas - version: 0.3.27 - build: openmp_h517c56d_1 - build_number: 1 + name: aws-checksums + version: 0.2.2 + build: hc8a0bd2_4 + build_number: 4 subdir: osx-arm64 - url: https://conda.anaconda.org/conda-forge/osx-arm64/libopenblas-0.3.27-openmp_h517c56d_1.conda - sha256: 46cfcc592b5255262f567cd098be3c61da6bca6c24d640e878dc8342b0f6d069 - md5: 71b8a34d70aa567a990162f327e81505 + url: https://conda.anaconda.org/conda-forge/osx-arm64/aws-checksums-0.2.2-hc8a0bd2_4.conda + sha256: 215086d95e8ff1d3fcb0197ada116cc9d7db1fdae7573f5e810d20fa9215b47c + md5: e70e88a357a3749b67679c0788c5b08a depends: - __osx >=11.0 - - libgfortran 5.* - - libgfortran5 >=12.3.0 - - llvm-openmp >=16.0.6 - constrains: - - openblas >=0.3.27,<0.3.28.0a0 - license: BSD-3-Clause - license_family: BSD - size: 2925328 - timestamp: 1720425811743 + - aws-c-common >=0.10.6,<0.10.7.0a0 + license: Apache-2.0 + license_family: Apache + size: 70186 + timestamp: 1733994496998 - kind: conda - name: libsodium - version: 1.0.20 - build: h99b78c6_0 + name: aws-crt-cpp + version: 0.29.7 + build: h19a973c_7 + build_number: 7 subdir: osx-arm64 - url: https://conda.anaconda.org/conda-forge/osx-arm64/libsodium-1.0.20-h99b78c6_0.conda - sha256: fade8223e1e1004367d7101dd17261003b60aa576df6d7802191f8972f7470b1 - md5: a7ce36e284c5faaf93c220dfc39e3abd + url: https://conda.anaconda.org/conda-forge/osx-arm64/aws-crt-cpp-0.29.7-h19a973c_7.conda + sha256: 8269e6746eb3a5d15b732a3983888bf98dfc1f6594e95250fc8d16b43cfd5ff9 + md5: 95714136bef3e917bd5a2942d4682b20 depends: - __osx >=11.0 - license: ISC - size: 164972 - timestamp: 1716828607917 + - aws-c-auth >=0.8.0,<0.8.1.0a0 + - aws-c-cal >=0.8.1,<0.8.2.0a0 + - aws-c-common >=0.10.6,<0.10.7.0a0 + - aws-c-event-stream >=0.5.0,<0.5.1.0a0 + - aws-c-http >=0.9.2,<0.9.3.0a0 + - aws-c-io >=0.15.3,<0.15.4.0a0 + - aws-c-mqtt >=0.11.0,<0.11.1.0a0 + - aws-c-s3 >=0.7.7,<0.7.8.0a0 + - aws-c-sdkutils >=0.2.1,<0.2.2.0a0 + - libcxx >=18 + license: Apache-2.0 + license_family: Apache + size: 236249 + timestamp: 1734178020924 - kind: conda - name: libsqlite - version: 3.46.1 - build: hc14010f_0 + name: aws-sdk-cpp + version: 1.11.458 + build: he0ff2e4_4 + build_number: 4 subdir: osx-arm64 - url: https://conda.anaconda.org/conda-forge/osx-arm64/libsqlite-3.46.1-hc14010f_0.conda - sha256: 3725f962f490c5d44dae326d5f5b2e3c97f71a6322d914ccc85b5ddc2e50d120 - md5: 58050ec1724e58668d0126a1615553fa + url: https://conda.anaconda.org/conda-forge/osx-arm64/aws-sdk-cpp-1.11.458-he0ff2e4_4.conda + sha256: 535b970aaa13be45f8cab8205c59f044b17364111c41a227f061775a5c834e18 + md5: 0981ed87098b149bdb7d99a4a3fd0e58 depends: - __osx >=11.0 + - aws-c-common >=0.10.6,<0.10.7.0a0 + - aws-c-event-stream >=0.5.0,<0.5.1.0a0 + - aws-checksums >=0.2.2,<0.2.3.0a0 + - aws-crt-cpp >=0.29.7,<0.29.8.0a0 + - libcurl >=8.11.1,<9.0a0 + - libcxx >=18 - libzlib >=1.3.1,<2.0a0 - license: Unlicense - size: 829500 - timestamp: 1725353720793 + - openssl >=3.4.0,<4.0a0 + license: Apache-2.0 + license_family: Apache + size: 2826534 + timestamp: 1734094018287 - kind: conda - name: libzlib - version: 1.3.1 - build: hfb2fe0b_1 - build_number: 1 + name: azure-core-cpp + version: 1.14.0 + build: hd50102c_0 subdir: osx-arm64 - url: https://conda.anaconda.org/conda-forge/osx-arm64/libzlib-1.3.1-hfb2fe0b_1.conda - sha256: c34365dd37b0eab27b9693af32a1f7f284955517c2cc91f1b88a7ef4738ff03e - md5: 636077128927cf79fd933276dc3aed47 + url: https://conda.anaconda.org/conda-forge/osx-arm64/azure-core-cpp-1.14.0-hd50102c_0.conda + sha256: f5b91329ed59ffc0be8747784c6e4cc7e56250c54032883a83bc11808ef6a87e + md5: f093a11dcf3cdcca010b20a818fcc6dc depends: - __osx >=11.0 - constrains: - - zlib 1.3.1 *_1 - license: Zlib - license_family: Other - size: 46921 - timestamp: 1716874262512 + - libcurl >=8.10.1,<9.0a0 + - libcxx >=17 + - openssl >=3.3.2,<4.0a0 + license: MIT + license_family: MIT + size: 294299 + timestamp: 1728054014060 - kind: conda - name: llvm-openmp - version: 18.1.8 - build: hde57baf_1 - build_number: 1 + name: azure-identity-cpp + version: 1.10.0 + build: hc602bab_0 subdir: osx-arm64 - url: https://conda.anaconda.org/conda-forge/osx-arm64/llvm-openmp-18.1.8-hde57baf_1.conda - sha256: 7a76e2932ac77e6314bfa1c4ff83f617c8260313bfed1b8401b508ed3e9d70ba - md5: fe89757e3cd14bb1c6ebd68dac591363 + url: https://conda.anaconda.org/conda-forge/osx-arm64/azure-identity-cpp-1.10.0-hc602bab_0.conda + sha256: bde446b916fff5150606f8ed3e6058ffc55a3aa72381e46f1ab346590b1ae40a + md5: d7b71593a937459f2d4b67e1a4727dc2 depends: - __osx >=11.0 - constrains: - - openmp 18.1.8|18.1.8.* - license: Apache-2.0 WITH LLVM-exception - license_family: APACHE - size: 276263 - timestamp: 1723605341828 + - azure-core-cpp >=1.14.0,<1.14.1.0a0 + - libcxx >=17 + - openssl >=3.3.2,<4.0a0 + license: MIT + license_family: MIT + size: 166907 + timestamp: 1728486882502 - kind: conda - name: max - version: 24.5.0 - build: release - subdir: noarch - noarch: python - url: https://conda.modular.com/max/noarch/max-24.5.0-release.conda - sha256: 3050d7885a304944afbf93ca9786e56e6df20f0685e1705f88fab045fb5aae70 - md5: 662a61803cd141e857d3b9f821c7bd66 + name: azure-storage-blobs-cpp + version: 12.13.0 + build: h7585a09_1 + build_number: 1 + subdir: osx-arm64 + url: https://conda.anaconda.org/conda-forge/osx-arm64/azure-storage-blobs-cpp-12.13.0-h7585a09_1.conda + sha256: 08d52d130addc0fb55d5ba10d9fa483e39be25d69bac7f4c676c2c3069207590 + md5: 704238ef05d46144dae2e6b5853df8bc depends: - - max-core ==24.5.0 release - - max-python >=24.5.0,<25.0a0 - - mojo-jupyter ==24.5.0 release - - mblack ==24.5.0 release - size: 9642 - timestamp: 1726172475909 + - __osx >=11.0 + - azure-core-cpp >=1.14.0,<1.14.1.0a0 + - azure-storage-common-cpp >=12.8.0,<12.8.1.0a0 + - libcxx >=17 + license: MIT + license_family: MIT + size: 438636 + timestamp: 1728578216193 - kind: conda - name: max-core - version: 24.5.0 - build: release + name: azure-storage-common-cpp + version: 12.8.0 + build: h9ca1f76_1 + build_number: 1 subdir: osx-arm64 - url: https://conda.modular.com/max/osx-arm64/max-core-24.5.0-release.conda - sha256: 8848071dde1f98a4da8e39c90f9210098e7c3c4aaddd0e2255fd9fe1f01df0b7 - md5: fba502bf5142da57735a593ccf35a255 + url: https://conda.anaconda.org/conda-forge/osx-arm64/azure-storage-common-cpp-12.8.0-h9ca1f76_1.conda + sha256: 77ab04e8fe5636a2de9c718f72a43645f7502cd208868c8a91ffba385547d585 + md5: 7a187cd7b1445afc80253bb186a607cc depends: - - mblack ==24.5.0 release - arch: arm64 - platform: osx - size: 244231803 - timestamp: 1726175523753 + - __osx >=11.0 + - azure-core-cpp >=1.14.0,<1.14.1.0a0 + - libcxx >=17 + - libxml2 >=2.12.7,<3.0a0 + - openssl >=3.3.2,<4.0a0 + license: MIT + license_family: MIT + size: 121278 + timestamp: 1728563418777 - kind: conda - name: max-python - version: 24.5.0 - build: 3.12release + name: azure-storage-files-datalake-cpp + version: 12.12.0 + build: hcdd55da_1 + build_number: 1 subdir: osx-arm64 - url: https://conda.modular.com/max/osx-arm64/max-python-24.5.0-3.12release.conda - sha256: e6cdd0477236d49d4f6586d4a66ffe1c5e5cb188535a8ec09ed742eda12cbf5f - md5: f33d8f4cc5c17d893fdb5d6e162c08c6 + url: https://conda.anaconda.org/conda-forge/osx-arm64/azure-storage-files-datalake-cpp-12.12.0-hcdd55da_1.conda + sha256: f48523f8aa0b5b80f45a92f0556b388dd96f44ac2dc2f44a01d08c1822eec97d + md5: c49fbc5233fcbaa86391162ff1adef38 depends: - - max-core ==24.5.0 release - - python 3.12.* - - numpy >=1.18,<2.0 + - __osx >=11.0 + - azure-core-cpp >=1.14.0,<1.14.1.0a0 + - azure-storage-blobs-cpp >=12.13.0,<12.13.1.0a0 + - azure-storage-common-cpp >=12.8.0,<12.8.1.0a0 + - libcxx >=17 + license: MIT + license_family: MIT + size: 196032 + timestamp: 1728729672889 +- kind: conda + name: backoff + version: 2.2.1 + build: pyhd8ed1ab_1 + build_number: 1 + subdir: noarch + noarch: python + url: https://conda.anaconda.org/conda-forge/noarch/backoff-2.2.1-pyhd8ed1ab_1.conda + sha256: f334115c6b0c6c2cd0d28595365f205ec7eaa60bcc5ff91a75d7245f728be820 + md5: a38b801f2bcc12af80c2e02a9e4ce7d9 + depends: + - python >=3.9 + license: MIT + license_family: MIT + size: 18816 + timestamp: 1733771192649 +- kind: conda + name: brotli-python + version: 1.1.0 + build: py312hde4cb15_2 + build_number: 2 + subdir: osx-arm64 + url: https://conda.anaconda.org/conda-forge/osx-arm64/brotli-python-1.1.0-py312hde4cb15_2.conda + sha256: 254b411fa78ccc226f42daf606772972466f93e9bc6895eabb4cfda22f5178af + md5: a83c2ef76ccb11bc2349f4f17696b15d + depends: + - __osx >=11.0 + - libcxx >=17 + - python >=3.12,<3.13.0a0 + - python >=3.12,<3.13.0a0 *_cpython + - python_abi 3.12.* *_cp312 + constrains: + - libbrotlicommon 1.1.0 hd74edd7_2 + license: MIT + license_family: MIT + size: 339360 + timestamp: 1725268143995 +- kind: conda + name: bzip2 + version: 1.0.8 + build: h99b78c6_7 + build_number: 7 + subdir: osx-arm64 + url: https://conda.anaconda.org/conda-forge/osx-arm64/bzip2-1.0.8-h99b78c6_7.conda + sha256: adfa71f158cbd872a36394c56c3568e6034aa55c623634b37a4836bd036e6b91 + md5: fc6948412dbbbe9a4c9ddbbcfe0a79ab + depends: + - __osx >=11.0 + license: bzip2-1.0.6 + license_family: BSD + size: 122909 + timestamp: 1720974522888 +- kind: conda + name: c-ares + version: 1.34.4 + build: h5505292_0 + subdir: osx-arm64 + url: https://conda.anaconda.org/conda-forge/osx-arm64/c-ares-1.34.4-h5505292_0.conda + sha256: 09c0c8476e50b2955f474a4a1c17c4c047dd52993b5366b6ea8e968e583b921f + md5: c1c999a38a4303b29d75c636eaa13cf9 + depends: + - __osx >=11.0 + license: MIT + license_family: MIT + size: 179496 + timestamp: 1734208291879 +- kind: conda + name: ca-certificates + version: 2024.12.14 + build: hf0a4a13_0 + subdir: osx-arm64 + url: https://conda.anaconda.org/conda-forge/osx-arm64/ca-certificates-2024.12.14-hf0a4a13_0.conda + sha256: 256be633fd0882ccc1a7a32bc278547e1703f85082c0789a87a603ee3ab8fb82 + md5: 7cb381a6783d91902638e4ed1ebd478e + license: ISC + size: 157091 + timestamp: 1734208344343 +- kind: conda + name: certifi + version: 2024.12.14 + build: pyhd8ed1ab_0 + subdir: noarch + noarch: python + url: https://conda.anaconda.org/conda-forge/noarch/certifi-2024.12.14-pyhd8ed1ab_0.conda + sha256: 048c16a9cbcb1fbad02083414d3bc7c1d0eea4b39aee6aa6bf8d1d5089ca8bad + md5: 6feb87357ecd66733be3279f16a8c400 + depends: + - python >=3.9 + license: ISC + size: 161642 + timestamp: 1734380604767 +- kind: conda + name: cffi + version: 1.17.1 + build: py312h0fad829_0 + subdir: osx-arm64 + url: https://conda.anaconda.org/conda-forge/osx-arm64/cffi-1.17.1-py312h0fad829_0.conda + sha256: 8d91a0d01358b5c3f20297c6c536c5d24ccd3e0c2ddd37f9d0593d0f0070226f + md5: 19a5456f72f505881ba493979777b24e + depends: + - __osx >=11.0 + - libffi >=3.4,<4.0a0 + - pycparser + - python >=3.12,<3.13.0a0 + - python >=3.12,<3.13.0a0 *_cpython + - python_abi 3.12.* *_cp312 + license: MIT + license_family: MIT + size: 281206 + timestamp: 1725560813378 +- kind: conda + name: charset-normalizer + version: 3.4.1 + build: pyhd8ed1ab_0 + subdir: noarch + noarch: python + url: https://conda.anaconda.org/conda-forge/noarch/charset-normalizer-3.4.1-pyhd8ed1ab_0.conda + sha256: 4e0ee91b97e5de3e74567bdacea27f0139709fceca4db8adffbe24deffccb09b + md5: e83a31202d1c0a000fce3e9cf3825875 + depends: + - python >=3.9 + license: MIT + license_family: MIT + size: 47438 + timestamp: 1735929811779 +- kind: conda + name: click + version: 8.1.8 + build: pyh707e725_0 + subdir: noarch + noarch: python + url: https://conda.anaconda.org/conda-forge/noarch/click-8.1.8-pyh707e725_0.conda + sha256: c920d23cd1fcf565031c679adb62d848af60d6fbb0edc2d50ba475cea4f0d8ab + md5: f22f4d4970e09d68a10b922cbb0408d3 + depends: + - __unix + - python >=3.9 + license: BSD-3-Clause + license_family: BSD + size: 84705 + timestamp: 1734858922844 +- kind: conda + name: colorama + version: 0.4.6 + build: pyhd8ed1ab_1 + build_number: 1 + subdir: noarch + noarch: python + url: https://conda.anaconda.org/conda-forge/noarch/colorama-0.4.6-pyhd8ed1ab_1.conda + sha256: ab29d57dc70786c1269633ba3dff20288b81664d3ff8d21af995742e2bb03287 + md5: 962b9857ee8e7018c22f2776ffa0b2d7 + depends: + - python >=3.9 + license: BSD-3-Clause + license_family: BSD + size: 27011 + timestamp: 1733218222191 +- kind: conda + name: datasets + version: 2.14.4 + build: pyhd8ed1ab_0 + subdir: noarch + noarch: python + url: https://conda.anaconda.org/conda-forge/noarch/datasets-2.14.4-pyhd8ed1ab_0.conda + sha256: 7e09bd083a609138b780fcc4535924cb96814d2c908a36d4c64a2ba9ee3efe7f + md5: 3e087f072ce03c43a9b60522f5d0ca2f + depends: + - aiohttp + - dill >=0.3.0,<0.3.8 + - fsspec >=2021.11.1 + - huggingface_hub >=0.14.0,<1.0.0 + - importlib-metadata + - multiprocess + - numpy >=1.17 + - packaging + - pandas + - pyarrow >=8.0.0 + - python >=3.8.0 + - python-xxhash + - pyyaml >=5.1 + - requests >=2.19.0 + - tqdm >=4.62.1 + license: Apache-2.0 + license_family: Apache + size: 347303 + timestamp: 1691593908658 +- kind: conda + name: deprecated + version: 1.2.15 + build: pyhd8ed1ab_1 + build_number: 1 + subdir: noarch + noarch: python + url: https://conda.anaconda.org/conda-forge/noarch/deprecated-1.2.15-pyhd8ed1ab_1.conda + sha256: a20ebf2c9b02a6eb32412ceb5c4cffaae49417db7e75414a76417538293a9402 + md5: eaef2e94d5bd76f758545d172c1fda67 + depends: + - python >=3.9 + - wrapt <2,>=1.10 + license: MIT + license_family: MIT + size: 14297 + timestamp: 1733662697343 +- kind: conda + name: dill + version: 0.3.7 + build: pyhd8ed1ab_0 + subdir: noarch + noarch: python + url: https://conda.anaconda.org/conda-forge/noarch/dill-0.3.7-pyhd8ed1ab_0.conda + sha256: 4ff20c6be028be2825235631c45d9e4a75bca1de65f8840c02dfb28ea0137c45 + md5: 5e4f3466526c52bc9af2d2353a1460bd + depends: + - python >=3.7 + license: BSD-3-Clause + license_family: BSD + size: 87553 + timestamp: 1690101185422 +- kind: conda + name: dnspython + version: 2.7.0 + build: pyhff2d567_1 + build_number: 1 + subdir: noarch + noarch: python + url: https://conda.anaconda.org/conda-forge/noarch/dnspython-2.7.0-pyhff2d567_1.conda + sha256: 3ec40ccf63f2450c5e6c7dd579e42fc2e97caf0d8cd4ba24aa434e6fc264eda0 + md5: 5fbd60d61d21b4bd2f9d7a48fe100418 + depends: + - python >=3.9,<4.0.0 + - sniffio + constrains: + - aioquic >=1.0.0 + - wmi >=1.5.1 + - httpx >=0.26.0 + - trio >=0.23 + - cryptography >=43 + - httpcore >=1.0.0 + - idna >=3.7 + - h2 >=4.1.0 + license: ISC + license_family: OTHER + size: 172172 + timestamp: 1733256829961 +- kind: conda + name: email-validator + version: 2.2.0 + build: pyhd8ed1ab_1 + build_number: 1 + subdir: noarch + noarch: python + url: https://conda.anaconda.org/conda-forge/noarch/email-validator-2.2.0-pyhd8ed1ab_1.conda + sha256: b91a19eb78edfc2dbb36de9a67f74ee2416f1b5273dd7327abe53f2dbf864736 + md5: da16dd3b0b71339060cd44cb7110ddf9 + depends: + - dnspython >=2.0.0 + - idna >=2.0.0 + - python >=3.9 + license: Unlicense + size: 44401 + timestamp: 1733300827551 +- kind: conda + name: email_validator + version: 2.2.0 + build: hd8ed1ab_1 + build_number: 1 + subdir: noarch + noarch: generic + url: https://conda.anaconda.org/conda-forge/noarch/email_validator-2.2.0-hd8ed1ab_1.conda + sha256: e0d0fdf587aa0ed0ff08b2bce3ab355f46687b87b0775bfba01cc80a859ee6a2 + md5: 0794f8807ff2c6f020422cacb1bd7bfa + depends: + - email-validator >=2.2.0,<2.2.1.0a0 + license: Unlicense + size: 6552 + timestamp: 1733300828176 +- kind: conda + name: exceptiongroup + version: 1.2.2 + build: pyhd8ed1ab_1 + build_number: 1 + subdir: noarch + noarch: python + url: https://conda.anaconda.org/conda-forge/noarch/exceptiongroup-1.2.2-pyhd8ed1ab_1.conda + sha256: cbde2c64ec317118fc06b223c5fd87c8a680255e7348dd60e7b292d2e103e701 + md5: a16662747cdeb9abbac74d0057cc976e + depends: + - python >=3.9 + license: MIT and PSF-2.0 + size: 20486 + timestamp: 1733208916977 +- kind: conda + name: fastapi + version: 0.115.6 + build: pyhd8ed1ab_0 + subdir: noarch + noarch: python + url: https://conda.anaconda.org/conda-forge/noarch/fastapi-0.115.6-pyhd8ed1ab_0.conda + sha256: d7826d537c667093c9de96411a09585a8d620c84a830a0195e58e9a0df45f018 + md5: 1b1e0c97830cdf75f1f371bd467ab657 + depends: + - email_validator >=2.0.0 + - fastapi-cli >=0.0.5 + - httpx >=0.23.0 + - jinja2 >=2.11.2 + - pydantic >=1.7.4,!=1.8,!=1.8.1,!=2.0.0,!=2.0.1,!=2.1.0,<3.0.0 + - python >=3.9 + - python-multipart >=0.0.7 + - starlette >=0.40.0,<0.42.0 + - typing_extensions >=4.8.0 + - uvicorn-standard >=0.12.0 + license: MIT + license_family: MIT + size: 73084 + timestamp: 1733362427885 +- kind: conda + name: fastapi-cli + version: 0.0.7 + build: pyhd8ed1ab_0 + subdir: noarch + noarch: python + url: https://conda.anaconda.org/conda-forge/noarch/fastapi-cli-0.0.7-pyhd8ed1ab_0.conda + sha256: 300683731013b7221922339cd40430bb3c2ddeeb658fd7e37f5099ffe64e4db0 + md5: d960e0ea9e1c561aa928f6c4439f04c7 + depends: + - python >=3.9 + - rich-toolkit >=0.11.1 + - typer >=0.12.3 + - uvicorn-standard >=0.15.0 + license: MIT + license_family: MIT + size: 15546 + timestamp: 1734302408607 +- kind: conda + name: filelock + version: 3.16.1 + build: pyhd8ed1ab_1 + build_number: 1 + subdir: noarch + noarch: python + url: https://conda.anaconda.org/conda-forge/noarch/filelock-3.16.1-pyhd8ed1ab_1.conda + sha256: 18dca6e2194732df7ebf824abaefe999e4765ebe8e8a061269406ab88fc418b9 + md5: d692e9ba6f92dc51484bf3477e36ce7c + depends: + - python >=3.9 + license: Unlicense + size: 17441 + timestamp: 1733240909987 +- kind: conda + name: freetype + version: 2.12.1 + build: hadb7bae_2 + build_number: 2 + subdir: osx-arm64 + url: https://conda.anaconda.org/conda-forge/osx-arm64/freetype-2.12.1-hadb7bae_2.conda + sha256: 791673127e037a2dc0eebe122dc4f904cb3f6e635bb888f42cbe1a76b48748d9 + md5: e6085e516a3e304ce41a8ee08b9b89ad + depends: + - libpng >=1.6.39,<1.7.0a0 + - libzlib >=1.2.13,<2.0.0a0 + license: GPL-2.0-only OR FTL + size: 596430 + timestamp: 1694616332835 +- kind: conda + name: frozenlist + version: 1.5.0 + build: py312h0bf5046_0 + subdir: osx-arm64 + url: https://conda.anaconda.org/conda-forge/osx-arm64/frozenlist-1.5.0-py312h0bf5046_0.conda + sha256: 44d6d6b332421e621c029fb149f12dba1ccb5ed6ac632e2e807a9d92d6cb2864 + md5: 7960352935cc95ac23883c9b8c97f2ff + depends: + - __osx >=11.0 + - python >=3.12,<3.13.0a0 + - python >=3.12,<3.13.0a0 *_cpython - python_abi 3.12.* *_cp312 + license: Apache-2.0 + license_family: APACHE + size: 53366 + timestamp: 1729699762631 +- kind: conda + name: fsspec + version: 2024.12.0 + build: pyhd8ed1ab_0 + subdir: noarch + noarch: python + url: https://conda.anaconda.org/conda-forge/noarch/fsspec-2024.12.0-pyhd8ed1ab_0.conda + sha256: 3320970c4604989eadf908397a9475f9e6a96a773c185915111399cbfbe47817 + md5: e041ad4c43ab5e10c74587f95378ebc7 + depends: + - python >=3.9 + license: BSD-3-Clause + license_family: BSD + size: 137756 + timestamp: 1734650349242 +- kind: conda + name: gflags + version: 2.2.2 + build: hf9b8971_1005 + build_number: 1005 + subdir: osx-arm64 + url: https://conda.anaconda.org/conda-forge/osx-arm64/gflags-2.2.2-hf9b8971_1005.conda + sha256: fd56ed8a1dab72ab90d8a8929b6f916a6d9220ca297ff077f8f04c5ed3408e20 + md5: 57a511a5905caa37540eb914dfcbf1fb + depends: + - __osx >=11.0 + - libcxx >=17 + license: BSD-3-Clause + license_family: BSD + size: 82090 + timestamp: 1726600145480 +- kind: conda + name: glog + version: 0.7.1 + build: heb240a5_0 + subdir: osx-arm64 + url: https://conda.anaconda.org/conda-forge/osx-arm64/glog-0.7.1-heb240a5_0.conda + sha256: 9fc77de416953aa959039db72bc41bfa4600ae3ff84acad04a7d0c1ab9552602 + md5: fef68d0a95aa5b84b5c1a4f6f3bf40e1 + depends: + - __osx >=11.0 + - gflags >=2.2.2,<2.3.0a0 + - libcxx >=16 + license: BSD-3-Clause + license_family: BSD + size: 112215 + timestamp: 1718284365403 +- kind: conda + name: gojo + version: 0.1.13 + build: h60d57d3_0 + subdir: osx-arm64 + url: https://repo.prefix.dev/mojo-community/osx-arm64/gojo-0.1.13-h60d57d3_0.conda + sha256: 06475a69ac426781b628a3aefcf115dc8e7df0064637a04d6d039031a6e539f7 + depends: + - max >=24.5.0,<25 arch: arm64 platform: osx - size: 125388933 - timestamp: 1726175523755 + license: MIT + size: 999737 + timestamp: 1728268347402 - kind: conda - name: mblack - version: 24.5.0 - build: release + name: googleapis-common-protos + version: 1.66.0 + build: pyhff2d567_0 subdir: noarch noarch: python - url: https://conda.modular.com/max/noarch/mblack-24.5.0-release.conda - sha256: 913881fc3aa19db447ed82e898f261a413be9129dc43b9ea600e06030f76dbd5 - md5: 2bc6ce9f257235686dc1b2509cc7198d + url: https://conda.anaconda.org/conda-forge/noarch/googleapis-common-protos-1.66.0-pyhff2d567_0.conda + sha256: d8d19575a827f2c62500949b9536efdd6b5406c9f546a73b6a87ac90b03a5875 + md5: 4861e30ff0cd566ea6fb4593e3b7c22a depends: - - python >=3.9,<3.13 - - click >=8.0.0 - - mypy_extensions >=0.4.3 - - packaging >=22.0 - - pathspec >=0.9.0 - - platformdirs >=2 - - python + - protobuf >=3.20.2,<6.0.0.dev0,!=3.20.0,!=3.20.1,!=4.21.1,!=4.21.2,!=4.21.3,!=4.21.4,!=4.21.5 + - python >=3.9 + license: Apache-2.0 + license_family: APACHE + size: 116522 + timestamp: 1731459019854 +- kind: conda + name: h11 + version: 0.14.0 + build: pyhd8ed1ab_1 + build_number: 1 + subdir: noarch + noarch: python + url: https://conda.anaconda.org/conda-forge/noarch/h11-0.14.0-pyhd8ed1ab_1.conda + sha256: 622516185a7c740d5c7f27016d0c15b45782c1501e5611deec63fd70344ce7c8 + md5: 7ee49e89531c0dcbba9466f6d115d585 + depends: + - python >=3.9 + - typing_extensions license: MIT - size: 130435 - timestamp: 1726172475910 + license_family: MIT + size: 51846 + timestamp: 1733327599467 - kind: conda - name: mojo-jupyter - version: 24.5.0 - build: release + name: h2 + version: 4.1.0 + build: pyhd8ed1ab_1 + build_number: 1 subdir: noarch noarch: python - url: https://conda.modular.com/max/noarch/mojo-jupyter-24.5.0-release.conda - sha256: dff2e857eae32ce92fde12a712756d647f0aa312aeb5d79b350b2acbc71a2f96 - md5: 3b7be5cbff5b8015b095e950506be4b3 + url: https://conda.anaconda.org/conda-forge/noarch/h2-4.1.0-pyhd8ed1ab_1.conda + sha256: 843ddad410c370672a8250470697027618f104153612439076d4d7b91eeb7b5c + md5: 825927dc7b0f287ef8d4d0011bb113b1 depends: - - max-core ==24.5.0 release - - python >=3.9,<3.13 - - jupyter_client >=8.6.2,<8.7 - - python - size: 21595 - timestamp: 1726172475911 + - hpack >=4.0,<5 + - hyperframe >=6.0,<7 + - python >=3.9 + license: MIT + license_family: MIT + size: 52000 + timestamp: 1733298867359 - kind: conda - name: mypy_extensions - version: 1.0.0 - build: pyha770c72_0 + name: hpack + version: 4.0.0 + build: pyhd8ed1ab_1 + build_number: 1 + subdir: noarch + noarch: python + url: https://conda.anaconda.org/conda-forge/noarch/hpack-4.0.0-pyhd8ed1ab_1.conda + sha256: ec89b7e5b8aa2f0219f666084446e1fb7b54545861e9caa892acb24d125761b5 + md5: 2aa5ff7fa34a81b9196532c84c10d865 + depends: + - python >=3.9 + license: MIT + license_family: MIT + size: 29412 + timestamp: 1733299296857 +- kind: conda + name: httpcore + version: 1.0.7 + build: pyh29332c3_1 + build_number: 1 subdir: noarch noarch: python - url: https://conda.anaconda.org/conda-forge/noarch/mypy_extensions-1.0.0-pyha770c72_0.conda - sha256: f240217476e148e825420c6bc3a0c0efb08c0718b7042fae960400c02af858a3 - md5: 4eccaeba205f0aed9ac3a9ea58568ca3 + url: https://conda.anaconda.org/conda-forge/noarch/httpcore-1.0.7-pyh29332c3_1.conda + sha256: c84d012a245171f3ed666a8bf9319580c269b7843ffa79f26468842da3abd5df + md5: 2ca8e6dbc86525c8b95e3c0ffa26442e + depends: + - python >=3.8 + - h11 >=0.13,<0.15 + - h2 >=3,<5 + - sniffio 1.* + - anyio >=3.0,<5.0 + - certifi + license: BSD-3-Clause + license_family: BSD + size: 48959 + timestamp: 1731707562362 +- kind: conda + name: httptools + version: 0.6.4 + build: py312hea69d52_0 + subdir: osx-arm64 + url: https://conda.anaconda.org/conda-forge/osx-arm64/httptools-0.6.4-py312hea69d52_0.conda + sha256: 5e93cda79e32e8c0039e05ea1939e688da336187dab025f699b42ef529e848be + md5: e1747a8e8d2aca5499aaea9993bf31ff depends: - - python >=3.5 + - __osx >=11.0 + - python >=3.12,<3.13.0a0 + - python >=3.12,<3.13.0a0 *_cpython + - python_abi 3.12.* *_cp312 license: MIT license_family: MIT - size: 10492 - timestamp: 1675543414256 + size: 85623 + timestamp: 1732707871414 +- kind: conda + name: httpx + version: 0.28.1 + build: pyhd8ed1ab_0 + subdir: noarch + noarch: python + url: https://conda.anaconda.org/conda-forge/noarch/httpx-0.28.1-pyhd8ed1ab_0.conda + sha256: cd0f1de3697b252df95f98383e9edb1d00386bfdd03fdf607fa42fe5fcb09950 + md5: d6989ead454181f4f9bc987d3dc4e285 + depends: + - anyio + - certifi + - httpcore 1.* + - idna + - python >=3.9 + license: BSD-3-Clause + license_family: BSD + size: 63082 + timestamp: 1733663449209 +- kind: conda + name: huggingface_hub + version: 0.26.5 + build: pyhd8ed1ab_1 + build_number: 1 + subdir: noarch + noarch: python + url: https://conda.anaconda.org/conda-forge/noarch/huggingface_hub-0.26.5-pyhd8ed1ab_1.conda + sha256: 0c75532d914a04c73222be298ed2c6868739dd475b1b1a9137c52abe79873952 + md5: 73937038e21117fe401f8ea64fbaeacc + depends: + - filelock + - fsspec >=2023.5.0 + - packaging >=20.9 + - python >=3.9 + - pyyaml >=5.1 + - requests + - tqdm >=4.42.1 + - typing-extensions >=3.7.4.3 + - typing_extensions >=3.7.4.3 + license: Apache-2.0 + license_family: APACHE + size: 275466 + timestamp: 1733852454004 +- kind: conda + name: hyperframe + version: 6.0.1 + build: pyhd8ed1ab_1 + build_number: 1 + subdir: noarch + noarch: python + url: https://conda.anaconda.org/conda-forge/noarch/hyperframe-6.0.1-pyhd8ed1ab_1.conda + sha256: e91c6ef09d076e1d9a02819cd00fa7ee18ecf30cdd667605c853980216584d1b + md5: 566e75c90c1d0c8c459eb0ad9833dc7a + depends: + - python >=3.9 + license: MIT + license_family: MIT + size: 17239 + timestamp: 1733298862681 +- kind: conda + name: icu + version: '75.1' + build: hfee45f7_0 + subdir: osx-arm64 + url: https://conda.anaconda.org/conda-forge/osx-arm64/icu-75.1-hfee45f7_0.conda + sha256: 9ba12c93406f3df5ab0a43db8a4b4ef67a5871dfd401010fbe29b218b2cbe620 + md5: 5eb22c1d7b3fc4abb50d92d621583137 + depends: + - __osx >=11.0 + license: MIT + license_family: MIT + size: 11857802 + timestamp: 1720853997952 +- kind: conda + name: idna + version: '3.10' + build: pyhd8ed1ab_1 + build_number: 1 + subdir: noarch + noarch: python + url: https://conda.anaconda.org/conda-forge/noarch/idna-3.10-pyhd8ed1ab_1.conda + sha256: d7a472c9fd479e2e8dcb83fb8d433fce971ea369d704ece380e876f9c3494e87 + md5: 39a4f67be3286c86d696df570b1201b7 + depends: + - python >=3.9 + license: BSD-3-Clause + license_family: BSD + size: 49765 + timestamp: 1733211921194 +- kind: conda + name: importlib-metadata + version: 8.5.0 + build: pyha770c72_1 + build_number: 1 + subdir: noarch + noarch: python + url: https://conda.anaconda.org/conda-forge/noarch/importlib-metadata-8.5.0-pyha770c72_1.conda + sha256: 13766b88fc5b23581530d3a0287c0c58ad82f60401afefab283bf158d2be55a9 + md5: 315607a3030ad5d5227e76e0733798ff + depends: + - python >=3.9 + - zipp >=0.5 + license: Apache-2.0 + license_family: APACHE + size: 28623 + timestamp: 1733223207185 +- kind: conda + name: jinja2 + version: 3.1.5 + build: pyhd8ed1ab_0 + subdir: noarch + noarch: python + url: https://conda.anaconda.org/conda-forge/noarch/jinja2-3.1.5-pyhd8ed1ab_0.conda + sha256: 98977694b9ecaa3218662f843425f39501f81973c450f995eec68f1803ed71c3 + md5: 2752a6ed44105bfb18c9bef1177d9dcd + depends: + - markupsafe >=2.0 + - python >=3.9 + license: BSD-3-Clause + license_family: BSD + size: 112561 + timestamp: 1734824044952 +- kind: conda + name: jupyter_client + version: 8.6.3 + build: pyhd8ed1ab_1 + build_number: 1 + subdir: noarch + noarch: python + url: https://conda.anaconda.org/conda-forge/noarch/jupyter_client-8.6.3-pyhd8ed1ab_1.conda + sha256: 19d8bd5bb2fde910ec59e081eeb59529491995ce0d653a5209366611023a0b3a + md5: 4ebae00eae9705b0c3d6d1018a81d047 + depends: + - importlib-metadata >=4.8.3 + - jupyter_core >=4.12,!=5.0.* + - python >=3.9 + - python-dateutil >=2.8.2 + - pyzmq >=23.0 + - tornado >=6.2 + - traitlets >=5.3 + license: BSD-3-Clause + license_family: BSD + size: 106342 + timestamp: 1733441040958 +- kind: conda + name: jupyter_core + version: 5.7.2 + build: pyh31011fe_1 + build_number: 1 + subdir: noarch + noarch: python + url: https://conda.anaconda.org/conda-forge/noarch/jupyter_core-5.7.2-pyh31011fe_1.conda + sha256: 732b1e8536bc22a5a174baa79842d79db2f4956d90293dd82dc1b3f6099bcccd + md5: 0a2980dada0dd7fd0998f0342308b1b1 + depends: + - __unix + - platformdirs >=2.5 + - python >=3.8 + - traitlets >=5.3 + license: BSD-3-Clause + license_family: BSD + size: 57671 + timestamp: 1727163547058 +- kind: conda + name: krb5 + version: 1.21.3 + build: h237132a_0 + subdir: osx-arm64 + url: https://conda.anaconda.org/conda-forge/osx-arm64/krb5-1.21.3-h237132a_0.conda + sha256: 4442f957c3c77d69d9da3521268cad5d54c9033f1a73f99cde0a3658937b159b + md5: c6dc8a0fdec13a0565936655c33069a1 + depends: + - __osx >=11.0 + - libcxx >=16 + - libedit >=3.1.20191231,<3.2.0a0 + - libedit >=3.1.20191231,<4.0a0 + - openssl >=3.3.1,<4.0a0 + license: MIT + license_family: MIT + size: 1155530 + timestamp: 1719463474401 +- kind: conda + name: lcms2 + version: '2.16' + build: ha0e7c42_0 + subdir: osx-arm64 + url: https://conda.anaconda.org/conda-forge/osx-arm64/lcms2-2.16-ha0e7c42_0.conda + sha256: 151e0c84feb7e0747fabcc85006b8973b22f5abbc3af76a9add0b0ef0320ebe4 + md5: 66f6c134e76fe13cce8a9ea5814b5dd5 + depends: + - libjpeg-turbo >=3.0.0,<4.0a0 + - libtiff >=4.6.0,<4.8.0a0 + license: MIT + license_family: MIT + size: 211959 + timestamp: 1701647962657 +- kind: conda + name: lerc + version: 4.0.0 + build: h9a09cb3_0 + subdir: osx-arm64 + url: https://conda.anaconda.org/conda-forge/osx-arm64/lerc-4.0.0-h9a09cb3_0.tar.bz2 + sha256: 6f068bb53dfb6147d3147d981bb851bb5477e769407ad4e6a68edf482fdcb958 + md5: de462d5aacda3b30721b512c5da4e742 + depends: + - libcxx >=13.0.1 + license: Apache-2.0 + license_family: Apache + size: 215721 + timestamp: 1657977558796 +- kind: conda + name: libabseil + version: '20240722.0' + build: cxx17_h07bc746_4 + build_number: 4 + subdir: osx-arm64 + url: https://conda.anaconda.org/conda-forge/osx-arm64/libabseil-20240722.0-cxx17_h07bc746_4.conda + sha256: 05fa5e5e908962b9c5aba95f962e2ca81d9599c4715aebe5e4ddb72b309d1770 + md5: c2d95bd7aa8d564a9bd7eca5e571a5b3 + depends: + - __osx >=11.0 + - libcxx >=18 + constrains: + - libabseil-static =20240722.0=cxx17* + - abseil-cpp =20240722.0 + license: Apache-2.0 + license_family: Apache + size: 1178260 + timestamp: 1736008642885 +- kind: conda + name: libarrow + version: 18.1.0 + build: h0ad35bc_7_cpu + build_number: 7 + subdir: osx-arm64 + url: https://conda.anaconda.org/conda-forge/osx-arm64/libarrow-18.1.0-h0ad35bc_7_cpu.conda + sha256: 4fbdd8bb89d912bf03f10f9373a8d96a1cdd7a7851e107393418a3d2715bc27e + md5: 4ba2173203f44bbf03d19aaba6ed07d3 + depends: + - __osx >=11.0 + - aws-crt-cpp >=0.29.7,<0.29.8.0a0 + - aws-sdk-cpp >=1.11.458,<1.11.459.0a0 + - azure-core-cpp >=1.14.0,<1.14.1.0a0 + - azure-identity-cpp >=1.10.0,<1.10.1.0a0 + - azure-storage-blobs-cpp >=12.13.0,<12.13.1.0a0 + - azure-storage-files-datalake-cpp >=12.12.0,<12.12.1.0a0 + - bzip2 >=1.0.8,<2.0a0 + - glog >=0.7.1,<0.8.0a0 + - libabseil * cxx17* + - libabseil >=20240722.0,<20240723.0a0 + - libbrotlidec >=1.1.0,<1.2.0a0 + - libbrotlienc >=1.1.0,<1.2.0a0 + - libcxx >=18 + - libgoogle-cloud >=2.33.0,<2.34.0a0 + - libgoogle-cloud-storage >=2.33.0,<2.34.0a0 + - libre2-11 >=2024.7.2 + - libutf8proc >=2.9.0,<2.10.0a0 + - libzlib >=1.3.1,<2.0a0 + - lz4-c >=1.10.0,<1.11.0a0 + - orc >=2.0.3,<2.0.4.0a0 + - re2 + - snappy >=1.2.1,<1.3.0a0 + - zstd >=1.5.6,<1.6.0a0 + constrains: + - arrow-cpp <0.0a0 + - parquet-cpp <0.0a0 + - apache-arrow-proc =*=cpu + license: Apache-2.0 + license_family: APACHE + size: 5506699 + timestamp: 1735682962976 +- kind: conda + name: libarrow-acero + version: 18.1.0 + build: hf07054f_7_cpu + build_number: 7 + subdir: osx-arm64 + url: https://conda.anaconda.org/conda-forge/osx-arm64/libarrow-acero-18.1.0-hf07054f_7_cpu.conda + sha256: 86e20cebfdb4f335e98265c1b88f5053bf3e3648768a317856295846bfdbf2b4 + md5: 3eaf71fe987de13061db795e03bb1a1c + depends: + - __osx >=11.0 + - libarrow 18.1.0 h0ad35bc_7_cpu + - libcxx >=18 + license: Apache-2.0 + license_family: APACHE + size: 485185 + timestamp: 1735683071232 +- kind: conda + name: libarrow-dataset + version: 18.1.0 + build: hf07054f_7_cpu + build_number: 7 + subdir: osx-arm64 + url: https://conda.anaconda.org/conda-forge/osx-arm64/libarrow-dataset-18.1.0-hf07054f_7_cpu.conda + sha256: 52c5c4e9cd5f2ac91dcebb6a920ab2536febcea116ff8767e5439329d7da820b + md5: 97a2d3606682d94f7d73112e9ad684ae + depends: + - __osx >=11.0 + - libarrow 18.1.0 h0ad35bc_7_cpu + - libarrow-acero 18.1.0 hf07054f_7_cpu + - libcxx >=18 + - libparquet 18.1.0 h636d7b7_7_cpu + license: Apache-2.0 + license_family: APACHE + size: 491237 + timestamp: 1735684688308 +- kind: conda + name: libarrow-substrait + version: 18.1.0 + build: h4239455_7_cpu + build_number: 7 + subdir: osx-arm64 + url: https://conda.anaconda.org/conda-forge/osx-arm64/libarrow-substrait-18.1.0-h4239455_7_cpu.conda + sha256: a45bbdd6932aed972d6c6ce30a7439aa8ec9d9b8ee5affb350d41e50abdc0127 + md5: 91927747173f65695e441346c7145e26 + depends: + - __osx >=11.0 + - libabseil * cxx17* + - libabseil >=20240722.0,<20240723.0a0 + - libarrow 18.1.0 h0ad35bc_7_cpu + - libarrow-acero 18.1.0 hf07054f_7_cpu + - libarrow-dataset 18.1.0 hf07054f_7_cpu + - libcxx >=18 + - libprotobuf >=5.28.3,<5.28.4.0a0 + license: Apache-2.0 + license_family: APACHE + size: 452385 + timestamp: 1735684993831 +- kind: conda + name: libblas + version: 3.9.0 + build: 26_osxarm64_openblas + build_number: 26 + subdir: osx-arm64 + url: https://conda.anaconda.org/conda-forge/osx-arm64/libblas-3.9.0-26_osxarm64_openblas.conda + sha256: 597f9c3779caa979c8c6abbb3ba8c7191b84e1a910d6b0d10e5faf35284c450c + md5: 21be102c9ae80a67ba7de23b129aa7f6 + depends: + - libopenblas >=0.3.28,<0.3.29.0a0 + - libopenblas >=0.3.28,<1.0a0 + constrains: + - liblapack 3.9.0 26_osxarm64_openblas + - liblapacke 3.9.0 26_osxarm64_openblas + - libcblas 3.9.0 26_osxarm64_openblas + - blas * openblas + license: BSD-3-Clause + license_family: BSD + size: 16714 + timestamp: 1734433054681 +- kind: conda + name: libbrotlicommon + version: 1.1.0 + build: hd74edd7_2 + build_number: 2 + subdir: osx-arm64 + url: https://conda.anaconda.org/conda-forge/osx-arm64/libbrotlicommon-1.1.0-hd74edd7_2.conda + sha256: 839dacb741bdbb25e58f42088a2001b649f4f12195aeb700b5ddfca3267749e5 + md5: d0bf1dff146b799b319ea0434b93f779 + depends: + - __osx >=11.0 + license: MIT + license_family: MIT + size: 68426 + timestamp: 1725267943211 +- kind: conda + name: libbrotlidec + version: 1.1.0 + build: hd74edd7_2 + build_number: 2 + subdir: osx-arm64 + url: https://conda.anaconda.org/conda-forge/osx-arm64/libbrotlidec-1.1.0-hd74edd7_2.conda + sha256: 6c6862eb274f21a7c0b60e5345467a12e6dda8b9af4438c66d496a2c1a538264 + md5: 55e66e68ce55523a6811633dd1ac74e2 + depends: + - __osx >=11.0 + - libbrotlicommon 1.1.0 hd74edd7_2 + license: MIT + license_family: MIT + size: 28378 + timestamp: 1725267980316 +- kind: conda + name: libbrotlienc + version: 1.1.0 + build: hd74edd7_2 + build_number: 2 + subdir: osx-arm64 + url: https://conda.anaconda.org/conda-forge/osx-arm64/libbrotlienc-1.1.0-hd74edd7_2.conda + sha256: eeb1eb0d58b9d02bc1b98dc0a058f104ab168eb2f7d1c7bfa0570a12cfcdb7b7 + md5: 4f3a434504c67b2c42565c0b85c1885c + depends: + - __osx >=11.0 + - libbrotlicommon 1.1.0 hd74edd7_2 + license: MIT + license_family: MIT + size: 279644 + timestamp: 1725268003553 +- kind: conda + name: libcblas + version: 3.9.0 + build: 26_osxarm64_openblas + build_number: 26 + subdir: osx-arm64 + url: https://conda.anaconda.org/conda-forge/osx-arm64/libcblas-3.9.0-26_osxarm64_openblas.conda + sha256: 27a29ef6b2fd2179bc3a0bb9db351f078ba140ca10485dca147c399639f84c93 + md5: a0e9980fe12d42f6d0c0ec009f67e948 + depends: + - libblas 3.9.0 26_osxarm64_openblas + constrains: + - liblapack 3.9.0 26_osxarm64_openblas + - liblapacke 3.9.0 26_osxarm64_openblas + - blas * openblas + license: BSD-3-Clause + license_family: BSD + size: 16628 + timestamp: 1734433061517 +- kind: conda + name: libcrc32c + version: 1.1.2 + build: hbdafb3b_0 + subdir: osx-arm64 + url: https://conda.anaconda.org/conda-forge/osx-arm64/libcrc32c-1.1.2-hbdafb3b_0.tar.bz2 + sha256: 58477b67cc719060b5b069ba57161e20ba69b8695d154a719cb4b60caf577929 + md5: 32bd82a6a625ea6ce090a81c3d34edeb + depends: + - libcxx >=11.1.0 + license: BSD-3-Clause + license_family: BSD + size: 18765 + timestamp: 1633683992603 +- kind: conda + name: libcurl + version: 8.11.1 + build: h73640d1_0 + subdir: osx-arm64 + url: https://conda.anaconda.org/conda-forge/osx-arm64/libcurl-8.11.1-h73640d1_0.conda + sha256: f47c35938144c23278987c7d12096f6a42d7c850ffc277222b032073412383b6 + md5: 46d7524cabfdd199bffe63f8f19a552b + depends: + - __osx >=11.0 + - krb5 >=1.21.3,<1.22.0a0 + - libnghttp2 >=1.64.0,<2.0a0 + - libssh2 >=1.11.1,<2.0a0 + - libzlib >=1.3.1,<2.0a0 + - openssl >=3.4.0,<4.0a0 + - zstd >=1.5.6,<1.6.0a0 + license: curl + license_family: MIT + size: 385098 + timestamp: 1734000160270 +- kind: conda + name: libcxx + version: 19.1.6 + build: ha82da77_1 + build_number: 1 + subdir: osx-arm64 + url: https://conda.anaconda.org/conda-forge/osx-arm64/libcxx-19.1.6-ha82da77_1.conda + sha256: 2b2443404503cd862385fd2f2a2c73f9624686fd1e5a45050b4034cfc06904ec + md5: ce5252d8db110cdb4ae4173d0a63c7c5 + depends: + - __osx >=11.0 + license: Apache-2.0 WITH LLVM-exception + license_family: Apache + size: 520992 + timestamp: 1734494699681 +- kind: conda + name: libdeflate + version: '1.23' + build: hec38601_0 + subdir: osx-arm64 + url: https://conda.anaconda.org/conda-forge/osx-arm64/libdeflate-1.23-hec38601_0.conda + sha256: 887c02deaed6d583459eba6367023e36d8761085b2f7126e389424f57155da53 + md5: 1d8b9588be14e71df38c525767a1ac30 + depends: + - __osx >=11.0 + license: MIT + license_family: MIT + size: 54132 + timestamp: 1734373971372 +- kind: conda + name: libedit + version: 3.1.20191231 + build: hc8eb9b7_2 + build_number: 2 + subdir: osx-arm64 + url: https://conda.anaconda.org/conda-forge/osx-arm64/libedit-3.1.20191231-hc8eb9b7_2.tar.bz2 + sha256: 3912636197933ecfe4692634119e8644904b41a58f30cad9d1fc02f6ba4d9fca + md5: 30e4362988a2623e9eb34337b83e01f9 + depends: + - ncurses >=6.2,<7.0.0a0 + license: BSD-2-Clause + license_family: BSD + size: 96607 + timestamp: 1597616630749 +- kind: conda + name: libev + version: '4.33' + build: h93a5062_2 + build_number: 2 + subdir: osx-arm64 + url: https://conda.anaconda.org/conda-forge/osx-arm64/libev-4.33-h93a5062_2.conda + sha256: 95cecb3902fbe0399c3a7e67a5bed1db813e5ab0e22f4023a5e0f722f2cc214f + md5: 36d33e440c31857372a72137f78bacf5 + license: BSD-2-Clause + license_family: BSD + size: 107458 + timestamp: 1702146414478 +- kind: conda + name: libevent + version: 2.1.12 + build: h2757513_1 + build_number: 1 + subdir: osx-arm64 + url: https://conda.anaconda.org/conda-forge/osx-arm64/libevent-2.1.12-h2757513_1.conda + sha256: 8c136d7586259bb5c0d2b913aaadc5b9737787ae4f40e3ad1beaf96c80b919b7 + md5: 1a109764bff3bdc7bdd84088347d71dc + depends: + - openssl >=3.1.1,<4.0a0 + license: BSD-3-Clause + license_family: BSD + size: 368167 + timestamp: 1685726248899 +- kind: conda + name: libexpat + version: 2.6.4 + build: h286801f_0 + subdir: osx-arm64 + url: https://conda.anaconda.org/conda-forge/osx-arm64/libexpat-2.6.4-h286801f_0.conda + sha256: e42ab5ace927ee7c84e3f0f7d813671e1cf3529f5f06ee5899606630498c2745 + md5: 38d2656dd914feb0cab8c629370768bf + depends: + - __osx >=11.0 + constrains: + - expat 2.6.4.* + license: MIT + license_family: MIT + size: 64693 + timestamp: 1730967175868 +- kind: conda + name: libffi + version: 3.4.2 + build: h3422bc3_5 + build_number: 5 + subdir: osx-arm64 + url: https://conda.anaconda.org/conda-forge/osx-arm64/libffi-3.4.2-h3422bc3_5.tar.bz2 + sha256: 41b3d13efb775e340e4dba549ab5c029611ea6918703096b2eaa9c015c0750ca + md5: 086914b672be056eb70fd4285b6783b6 + license: MIT + license_family: MIT + size: 39020 + timestamp: 1636488587153 +- kind: conda + name: libgfortran + version: 5.0.0 + build: 13_2_0_hd922786_3 + build_number: 3 + subdir: osx-arm64 + url: https://conda.anaconda.org/conda-forge/osx-arm64/libgfortran-5.0.0-13_2_0_hd922786_3.conda + sha256: 44e541b4821c96b28b27fef5630883a60ce4fee91fd9c79f25a199f8f73f337b + md5: 4a55d9e169114b2b90d3ec4604cd7bbf + depends: + - libgfortran5 13.2.0 hf226fd6_3 + license: GPL-3.0-only WITH GCC-exception-3.1 + license_family: GPL + size: 110233 + timestamp: 1707330749033 +- kind: conda + name: libgfortran5 + version: 13.2.0 + build: hf226fd6_3 + build_number: 3 + subdir: osx-arm64 + url: https://conda.anaconda.org/conda-forge/osx-arm64/libgfortran5-13.2.0-hf226fd6_3.conda + sha256: bafc679eedb468a86aa4636061c55966186399ee0a04b605920d208d97ac579a + md5: 66ac81d54e95c534ae488726c1f698ea + depends: + - llvm-openmp >=8.0.0 + constrains: + - libgfortran 5.0.0 13_2_0_*_3 + license: GPL-3.0-only WITH GCC-exception-3.1 + license_family: GPL + size: 997381 + timestamp: 1707330687590 +- kind: conda + name: libgoogle-cloud + version: 2.33.0 + build: hdbe95d5_1 + build_number: 1 + subdir: osx-arm64 + url: https://conda.anaconda.org/conda-forge/osx-arm64/libgoogle-cloud-2.33.0-hdbe95d5_1.conda + sha256: ce95aca02451694a4154c7770b6addf4fb859abf17912de6ec947da8469a56ce + md5: 91de1fbab8610974c0094c266bc63435 + depends: + - __osx >=11.0 + - libabseil * cxx17* + - libabseil >=20240722.0,<20240723.0a0 + - libcurl >=8.11.1,<9.0a0 + - libcxx >=18 + - libgrpc >=1.67.1,<1.68.0a0 + - libprotobuf >=5.28.3,<5.28.4.0a0 + - openssl >=3.4.0,<4.0a0 + constrains: + - libgoogle-cloud 2.33.0 *_1 + license: Apache-2.0 + license_family: Apache + size: 877594 + timestamp: 1735648230965 +- kind: conda + name: libgoogle-cloud-storage + version: 2.33.0 + build: h7081f7f_1 + build_number: 1 + subdir: osx-arm64 + url: https://conda.anaconda.org/conda-forge/osx-arm64/libgoogle-cloud-storage-2.33.0-h7081f7f_1.conda + sha256: c0524a22064bc17f5c037da09ba54cc9e767741ef645178e499750c44bec2531 + md5: af8e51382464d4cc2d0054977c40a732 + depends: + - __osx >=11.0 + - libabseil + - libcrc32c >=1.1.2,<1.2.0a0 + - libcurl + - libcxx >=18 + - libgoogle-cloud 2.33.0 hdbe95d5_1 + - libzlib >=1.3.1,<2.0a0 + - openssl + license: Apache-2.0 + license_family: Apache + size: 526963 + timestamp: 1735649222088 +- kind: conda + name: libgrpc + version: 1.67.1 + build: h0a426d6_1 + build_number: 1 + subdir: osx-arm64 + url: https://conda.anaconda.org/conda-forge/osx-arm64/libgrpc-1.67.1-h0a426d6_1.conda + sha256: 630edf63981818ff590367cb95fddbed0f5a390464d0952c90ec81de899e84a6 + md5: 8a3cba079d6ac985e7d73c76a678fbb4 + depends: + - __osx >=11.0 + - c-ares >=1.34.4,<2.0a0 + - libabseil * cxx17* + - libabseil >=20240722.0,<20240723.0a0 + - libcxx >=18 + - libprotobuf >=5.28.3,<5.28.4.0a0 + - libre2-11 >=2024.7.2 + - libzlib >=1.3.1,<2.0a0 + - openssl >=3.4.0,<4.0a0 + - re2 + constrains: + - grpc-cpp =1.67.1 + license: Apache-2.0 + license_family: APACHE + size: 5311706 + timestamp: 1735585137716 +- kind: conda + name: libiconv + version: '1.17' + build: h0d3ecfb_2 + build_number: 2 + subdir: osx-arm64 + url: https://conda.anaconda.org/conda-forge/osx-arm64/libiconv-1.17-h0d3ecfb_2.conda + sha256: bc7de5097b97bcafcf7deaaed505f7ce02f648aac8eccc0d5a47cc599a1d0304 + md5: 69bda57310071cf6d2b86caf11573d2d + license: LGPL-2.1-only + size: 676469 + timestamp: 1702682458114 +- kind: conda + name: libjpeg-turbo + version: 3.0.0 + build: hb547adb_1 + build_number: 1 + subdir: osx-arm64 + url: https://conda.anaconda.org/conda-forge/osx-arm64/libjpeg-turbo-3.0.0-hb547adb_1.conda + sha256: a42054eaa38e84fc1e5ab443facac4bbc9d1b6b6f23f54b7bf4f1eb687e1d993 + md5: 3ff1e053dc3a2b8e36b9bfa4256a58d1 + constrains: + - jpeg <0.0.0a + license: IJG AND BSD-3-Clause AND Zlib + size: 547541 + timestamp: 1694475104253 +- kind: conda + name: liblapack + version: 3.9.0 + build: 26_osxarm64_openblas + build_number: 26 + subdir: osx-arm64 + url: https://conda.anaconda.org/conda-forge/osx-arm64/liblapack-3.9.0-26_osxarm64_openblas.conda + sha256: dd6d9a21e672aee4332f019c8229ce70cf5eaf6c2f4cbd1443b105fb66c00dc5 + md5: cebad79038a75cfd28fa90d147a2d34d + depends: + - libblas 3.9.0 26_osxarm64_openblas + constrains: + - liblapacke 3.9.0 26_osxarm64_openblas + - libcblas 3.9.0 26_osxarm64_openblas + - blas * openblas + license: BSD-3-Clause + license_family: BSD + size: 16624 + timestamp: 1734433068120 +- kind: conda + name: liblzma + version: 5.6.3 + build: h39f12f2_1 + build_number: 1 + subdir: osx-arm64 + url: https://conda.anaconda.org/conda-forge/osx-arm64/liblzma-5.6.3-h39f12f2_1.conda + sha256: d863b8257406918ffdc50ae65502f2b2d6cede29404d09a094f59509d6a0aaf1 + md5: b2553114a7f5e20ccd02378a77d836aa + depends: + - __osx >=11.0 + license: 0BSD + size: 99129 + timestamp: 1733407496073 +- kind: conda + name: libnghttp2 + version: 1.64.0 + build: h6d7220d_0 + subdir: osx-arm64 + url: https://conda.anaconda.org/conda-forge/osx-arm64/libnghttp2-1.64.0-h6d7220d_0.conda + sha256: 00cc685824f39f51be5233b54e19f45abd60de5d8847f1a56906f8936648b72f + md5: 3408c02539cee5f1141f9f11450b6a51 + depends: + - __osx >=11.0 + - c-ares >=1.34.2,<2.0a0 + - libcxx >=17 + - libev >=4.33,<4.34.0a0 + - libev >=4.33,<5.0a0 + - libzlib >=1.3.1,<2.0a0 + - openssl >=3.3.2,<4.0a0 + license: MIT + license_family: MIT + size: 566719 + timestamp: 1729572385640 +- kind: conda + name: libopenblas + version: 0.3.28 + build: openmp_hf332438_1 + build_number: 1 + subdir: osx-arm64 + url: https://conda.anaconda.org/conda-forge/osx-arm64/libopenblas-0.3.28-openmp_hf332438_1.conda + sha256: 62bb669c37a845129096f73d446cdb6bb170e4927f2fea2b661329680dbbc373 + md5: 40803a48d947c8639da6704e9a44d3ce + depends: + - __osx >=11.0 + - libgfortran 5.* + - libgfortran5 >=13.2.0 + - llvm-openmp >=18.1.8 + constrains: + - openblas >=0.3.28,<0.3.29.0a0 + license: BSD-3-Clause + license_family: BSD + size: 4165774 + timestamp: 1730772154295 +- kind: conda + name: libparquet + version: 18.1.0 + build: h636d7b7_7_cpu + build_number: 7 + subdir: osx-arm64 + url: https://conda.anaconda.org/conda-forge/osx-arm64/libparquet-18.1.0-h636d7b7_7_cpu.conda + sha256: bf42e43542a90edd86ba5aa5fd4543671625f1bc35f62be32688f00e18bae990 + md5: 93de9ba66a20db32a2646d313794b3a8 + depends: + - __osx >=11.0 + - libarrow 18.1.0 h0ad35bc_7_cpu + - libcxx >=18 + - libthrift >=0.21.0,<0.21.1.0a0 + - openssl >=3.4.0,<4.0a0 + license: Apache-2.0 + license_family: APACHE + size: 873251 + timestamp: 1735684582558 +- kind: conda + name: libpng + version: 1.6.44 + build: hc14010f_0 + subdir: osx-arm64 + url: https://conda.anaconda.org/conda-forge/osx-arm64/libpng-1.6.44-hc14010f_0.conda + sha256: 38f8759a3eb8060deabd4db41f0f023514d853e46ddcbd0ba21768fc4e563bb1 + md5: fb36e93f0ea6a6f5d2b99984f34b049e + depends: + - __osx >=11.0 + - libzlib >=1.3.1,<2.0a0 + license: zlib-acknowledgement + size: 263385 + timestamp: 1726234714421 +- kind: conda + name: libprotobuf + version: 5.28.3 + build: h3bd63a1_1 + build_number: 1 + subdir: osx-arm64 + url: https://conda.anaconda.org/conda-forge/osx-arm64/libprotobuf-5.28.3-h3bd63a1_1.conda + sha256: f58a16b13ad53346903c833e266f83c3d770a43a432659b98710aed85ca885e7 + md5: bdbfea4cf45ae36652c6bbcc2e7ebe91 + depends: + - __osx >=11.0 + - libabseil * cxx17* + - libabseil >=20240722.0,<20240723.0a0 + - libcxx >=18 + - libzlib >=1.3.1,<2.0a0 + license: BSD-3-Clause + license_family: BSD + size: 2271580 + timestamp: 1735576361997 +- kind: conda + name: libre2-11 + version: 2024.07.02 + build: h07bc746_2 + build_number: 2 + subdir: osx-arm64 + url: https://conda.anaconda.org/conda-forge/osx-arm64/libre2-11-2024.07.02-h07bc746_2.conda + sha256: 112a73ad483353751d4c5d63648c69a4d6fcebf5e1b698a860a3f5124fc3db96 + md5: 6b1e3624d3488016ca4f1ca0c412efaa + depends: + - __osx >=11.0 + - libabseil * cxx17* + - libabseil >=20240722.0,<20240723.0a0 + - libcxx >=18 + constrains: + - re2 2024.07.02.* + license: BSD-3-Clause + license_family: BSD + size: 167155 + timestamp: 1735541067807 +- kind: conda + name: libsodium + version: 1.0.20 + build: h99b78c6_0 + subdir: osx-arm64 + url: https://conda.anaconda.org/conda-forge/osx-arm64/libsodium-1.0.20-h99b78c6_0.conda + sha256: fade8223e1e1004367d7101dd17261003b60aa576df6d7802191f8972f7470b1 + md5: a7ce36e284c5faaf93c220dfc39e3abd + depends: + - __osx >=11.0 + license: ISC + size: 164972 + timestamp: 1716828607917 +- kind: conda + name: libsqlite + version: 3.47.2 + build: h3f77e49_0 + subdir: osx-arm64 + url: https://conda.anaconda.org/conda-forge/osx-arm64/libsqlite-3.47.2-h3f77e49_0.conda + sha256: f192f3c8973de9ec4c214990715f13b781965247a5cedf9162e7f9e699cfc3c4 + md5: 122d6f29470f1a991e85608e77e56a8a + depends: + - __osx >=11.0 + - libzlib >=1.3.1,<2.0a0 + license: Unlicense + size: 850553 + timestamp: 1733762057506 +- kind: conda + name: libssh2 + version: 1.11.1 + build: h9cc3647_0 + subdir: osx-arm64 + url: https://conda.anaconda.org/conda-forge/osx-arm64/libssh2-1.11.1-h9cc3647_0.conda + sha256: f7047c6ed44bcaeb04432e8c74da87591940d091b0a3940c0d884b7faa8062e9 + md5: ddc7194676c285513706e5fc64f214d7 + depends: + - libzlib >=1.3.1,<2.0a0 + - openssl >=3.4.0,<4.0a0 + license: BSD-3-Clause + license_family: BSD + size: 279028 + timestamp: 1732349599461 +- kind: conda + name: libthrift + version: 0.21.0 + build: h64651cc_0 + subdir: osx-arm64 + url: https://conda.anaconda.org/conda-forge/osx-arm64/libthrift-0.21.0-h64651cc_0.conda + sha256: 7a6c7d5f58cbbc2ccd6493b4b821639fdb0701b9b04c737a949e8cb6adf1c9ad + md5: 7ce2bd2f650f8c31ad7ba4c7bfea61b7 + depends: + - __osx >=11.0 + - libcxx >=17 + - libevent >=2.1.12,<2.1.13.0a0 + - libzlib >=1.3.1,<2.0a0 + - openssl >=3.3.2,<4.0a0 + license: Apache-2.0 + license_family: APACHE + size: 324342 + timestamp: 1727206096912 +- kind: conda + name: libtiff + version: 4.7.0 + build: h551f018_3 + build_number: 3 + subdir: osx-arm64 + url: https://conda.anaconda.org/conda-forge/osx-arm64/libtiff-4.7.0-h551f018_3.conda + sha256: 91417846157e04992801438a496b151df89604b2e7c6775d6f701fcd0cbed5ae + md5: a5d084a957563e614ec0c0196d890654 + depends: + - __osx >=11.0 + - lerc >=4.0.0,<5.0a0 + - libcxx >=18 + - libdeflate >=1.23,<1.24.0a0 + - libjpeg-turbo >=3.0.0,<4.0a0 + - liblzma >=5.6.3,<6.0a0 + - libwebp-base >=1.4.0,<2.0a0 + - libzlib >=1.3.1,<2.0a0 + - zstd >=1.5.6,<1.6.0a0 + license: HPND + size: 370600 + timestamp: 1734398863052 +- kind: conda + name: libutf8proc + version: 2.9.0 + build: h5505292_1 + build_number: 1 + subdir: osx-arm64 + url: https://conda.anaconda.org/conda-forge/osx-arm64/libutf8proc-2.9.0-h5505292_1.conda + sha256: ea88f06e97ef8fa2490f7594f8885bb542577226edf8abba3144302d951a53c2 + md5: f777470d31c78cd0abe1903a2fda436f + depends: + - __osx >=11.0 + license: MIT + license_family: MIT + size: 83000 + timestamp: 1732868631531 +- kind: conda + name: libuv + version: 1.49.2 + build: h7ab814d_0 + subdir: osx-arm64 + url: https://conda.anaconda.org/conda-forge/osx-arm64/libuv-1.49.2-h7ab814d_0.conda + sha256: 0e5176af1e788ad5006cf261c4ea5a288a935fda48993b0240ddd2e562dc3d02 + md5: 4bc348e3a1a74d20a3f9beb866d75e0a + depends: + - __osx >=11.0 + license: MIT + license_family: MIT + size: 410500 + timestamp: 1729322654121 +- kind: conda + name: libwebp-base + version: 1.5.0 + build: h2471fea_0 + subdir: osx-arm64 + url: https://conda.anaconda.org/conda-forge/osx-arm64/libwebp-base-1.5.0-h2471fea_0.conda + sha256: f8bdb876b4bc8cb5df47c28af29188de8911c3fea4b799a33743500149de3f4a + md5: 569466afeb84f90d5bb88c11cc23d746 + depends: + - __osx >=11.0 + constrains: + - libwebp 1.5.0 + license: BSD-3-Clause + license_family: BSD + size: 290013 + timestamp: 1734777593617 +- kind: conda + name: libxcb + version: 1.17.0 + build: hdb1d25a_0 + subdir: osx-arm64 + url: https://conda.anaconda.org/conda-forge/osx-arm64/libxcb-1.17.0-hdb1d25a_0.conda + sha256: bd3816218924b1e43b275863e21a3e13a5db4a6da74cca8e60bc3c213eb62f71 + md5: af523aae2eca6dfa1c8eec693f5b9a79 + depends: + - __osx >=11.0 + - pthread-stubs + - xorg-libxau >=1.0.11,<2.0a0 + - xorg-libxdmcp + license: MIT + license_family: MIT + size: 323658 + timestamp: 1727278733917 +- kind: conda + name: libxml2 + version: 2.13.5 + build: h178c5d8_1 + build_number: 1 + subdir: osx-arm64 + url: https://conda.anaconda.org/conda-forge/osx-arm64/libxml2-2.13.5-h178c5d8_1.conda + sha256: d7af3f25a4cece170502acd38f2dafbea4521f373f46dcb28a37fbe6ac2da544 + md5: 3dc3cff0eca1640a6acbbfab2f78139e + depends: + - __osx >=11.0 + - icu >=75.1,<76.0a0 + - libiconv >=1.17,<2.0a0 + - liblzma >=5.6.3,<6.0a0 + - libzlib >=1.3.1,<2.0a0 + license: MIT + license_family: MIT + size: 582898 + timestamp: 1733443841584 +- kind: conda + name: libzlib + version: 1.3.1 + build: h8359307_2 + build_number: 2 + subdir: osx-arm64 + url: https://conda.anaconda.org/conda-forge/osx-arm64/libzlib-1.3.1-h8359307_2.conda + sha256: ce34669eadaba351cd54910743e6a2261b67009624dbc7daeeafdef93616711b + md5: 369964e85dc26bfe78f41399b366c435 + depends: + - __osx >=11.0 + constrains: + - zlib 1.3.1 *_2 + license: Zlib + license_family: Other + size: 46438 + timestamp: 1727963202283 +- kind: conda + name: lightbug_http + version: 0.1.6 + build: h60d57d3_0 + subdir: osx-arm64 + url: https://repo.prefix.dev/mojo-community/osx-arm64/lightbug_http-0.1.6-h60d57d3_0.conda + sha256: 3d22b064d795a652eb257afb21266f470557eb6ece805981373775e3abd7a0f0 + depends: + - max >=24.5.0 + - small_time ==0.1.3 + arch: arm64 + platform: osx + license: MIT + size: 972065 + timestamp: 1735496636396 +- kind: conda + name: llvm-openmp + version: 19.1.6 + build: hdb05f8b_0 + subdir: osx-arm64 + url: https://conda.anaconda.org/conda-forge/osx-arm64/llvm-openmp-19.1.6-hdb05f8b_0.conda + sha256: a0f3e9139ab16f0a67b9d2bbabc15b78977168f4a5b5503fed4962dcb9a96102 + md5: 34fdeffa0555a1a56f38839415cc066c + depends: + - __osx >=11.0 + constrains: + - openmp 19.1.6|19.1.6.* + license: Apache-2.0 WITH LLVM-exception + license_family: APACHE + size: 281251 + timestamp: 1734520462311 +- kind: conda + name: lz4-c + version: 1.10.0 + build: h286801f_1 + build_number: 1 + subdir: osx-arm64 + url: https://conda.anaconda.org/conda-forge/osx-arm64/lz4-c-1.10.0-h286801f_1.conda + sha256: 94d3e2a485dab8bdfdd4837880bde3dd0d701e2b97d6134b8806b7c8e69c8652 + md5: 01511afc6cc1909c5303cf31be17b44f + depends: + - __osx >=11.0 + - libcxx >=18 + license: BSD-2-Clause + license_family: BSD + size: 148824 + timestamp: 1733741047892 +- kind: conda + name: markdown-it-py + version: 3.0.0 + build: pyhd8ed1ab_1 + build_number: 1 + subdir: noarch + noarch: python + url: https://conda.anaconda.org/conda-forge/noarch/markdown-it-py-3.0.0-pyhd8ed1ab_1.conda + sha256: 0fbacdfb31e55964152b24d5567e9a9996e1e7902fb08eb7d91b5fd6ce60803a + md5: fee3164ac23dfca50cfcc8b85ddefb81 + depends: + - mdurl >=0.1,<1 + - python >=3.9 + license: MIT + license_family: MIT + size: 64430 + timestamp: 1733250550053 +- kind: conda + name: markupsafe + version: 3.0.2 + build: py312h998013c_1 + build_number: 1 + subdir: osx-arm64 + url: https://conda.anaconda.org/conda-forge/osx-arm64/markupsafe-3.0.2-py312h998013c_1.conda + sha256: 4aa997b244014d3707eeef54ab0ee497d12c0d0d184018960cce096169758283 + md5: 46e547061080fddf9cf95a0327e8aba6 + depends: + - __osx >=11.0 + - python >=3.12,<3.13.0a0 + - python >=3.12,<3.13.0a0 *_cpython + - python_abi 3.12.* *_cp312 + constrains: + - jinja2 >=3.0.0 + license: BSD-3-Clause + license_family: BSD + size: 24048 + timestamp: 1733219945697 +- kind: conda + name: max + version: 24.6.0 + build: release + subdir: noarch + noarch: python + url: https://conda.modular.com/max/noarch/max-24.6.0-release.conda + sha256: 0e3c1984ac7476550fd8fa5921bf1ca58950219b84ae21ecd861f650e45382ac + md5: e04b1405f630c9bb7d4cb5559840e902 + depends: + - max-core ==24.6.0 release + - max-python >=24.6.0,<25.0a0 + - mojo-jupyter ==24.6.0 release + - mblack ==24.6.0 release + license: LicenseRef-Modular-Proprietary + size: 9851 + timestamp: 1734039439696 +- kind: conda + name: max-core + version: 24.6.0 + build: release + subdir: osx-arm64 + url: https://conda.modular.com/max/osx-arm64/max-core-24.6.0-release.conda + sha256: 434c29e35067e296db55525cd5cf38bb013a1f7a7bfa99845bf6c317de6cdc12 + md5: 4a2ead0a9010c36b6193ea32f583e996 + depends: + - mblack ==24.6.0 release + arch: arm64 + platform: osx + license: LicenseRef-Modular-Proprietary + size: 212001240 + timestamp: 1734039726703 +- kind: conda + name: max-python + version: 24.6.0 + build: 3.12release + subdir: osx-arm64 + url: https://conda.modular.com/max/osx-arm64/max-python-24.6.0-3.12release.conda + sha256: c888b58cfc7c767d40aa100ff2bccf5c3ab11d58d897a6accb749e6b5b7014ea + md5: 62a92bfab3b5c85c2d246672bbb8bc8d + depends: + - max-core ==24.6.0 release + - python 3.12.* + - fastapi + - httpx + - huggingface_hub + - numpy >=1.18,<2.0 + - opentelemetry-api + - opentelemetry-exporter-otlp-proto-http >=1.27.0 + - opentelemetry-exporter-prometheus >=0.48b0 + - opentelemetry-sdk >=1.27.0 + - pillow + - pydantic-settings >=2.4.0,<3 + - pydantic >=2.4.0,<3 + - pyinstrument + - python-json-logger + - sse-starlette >=2.1.3,<3 + - transformers + - typing_extensions + - uvicorn + - python_abi 3.12.* *_cp312 + arch: arm64 + platform: osx + license: LicenseRef-Modular-Proprietary + size: 112484803 + timestamp: 1734039726707 +- kind: conda + name: mblack + version: 24.6.0 + build: release + subdir: noarch + noarch: python + url: https://conda.modular.com/max/noarch/mblack-24.6.0-release.conda + sha256: f135164020478078f4681aa77e7f6ca9f68b8e7ee02604b85342bbaf2f706f0d + md5: 77367aff981ba391ab5c047ba33ec978 + depends: + - python >=3.9,<3.13 + - click >=8.0.0 + - mypy_extensions >=0.4.3 + - packaging >=22.0 + - pathspec >=0.9.0 + - platformdirs >=2 + - python + license: MIT + size: 130668 + timestamp: 1734039439700 +- kind: conda + name: mdurl + version: 0.1.2 + build: pyhd8ed1ab_1 + build_number: 1 + subdir: noarch + noarch: python + url: https://conda.anaconda.org/conda-forge/noarch/mdurl-0.1.2-pyhd8ed1ab_1.conda + sha256: 78c1bbe1723449c52b7a9df1af2ee5f005209f67e40b6e1d3c7619127c43b1c7 + md5: 592132998493b3ff25fd7479396e8351 + depends: + - python >=3.9 + license: MIT + license_family: MIT + size: 14465 + timestamp: 1733255681319 +- kind: conda + name: mojo-jupyter + version: 24.6.0 + build: release + subdir: noarch + noarch: python + url: https://conda.modular.com/max/noarch/mojo-jupyter-24.6.0-release.conda + sha256: 2fe043d98ea77f8f165b39bd252cd04942216c8533f0291c49d87d6cfd8673df + md5: b17127f3ca2cef0976496407e1cd4081 + depends: + - max-core ==24.6.0 release + - python >=3.9,<3.13 + - jupyter_client >=8.6.2,<8.7 + - python + license: LicenseRef-Modular-Proprietary + size: 22990 + timestamp: 1734039439702 +- kind: conda + name: multidict + version: 6.1.0 + build: py312hdb8e49c_1 + build_number: 1 + subdir: osx-arm64 + url: https://conda.anaconda.org/conda-forge/osx-arm64/multidict-6.1.0-py312hdb8e49c_1.conda + sha256: 482fd09fb798090dc8cce2285fa69f43b1459099122eac2fb112d9b922b9f916 + md5: 0048335516fed938e4dd2c457b4c5b9b + depends: + - __osx >=11.0 + - python >=3.12,<3.13.0a0 + - python >=3.12,<3.13.0a0 *_cpython + - python_abi 3.12.* *_cp312 + license: Apache-2.0 + license_family: APACHE + size: 55968 + timestamp: 1729065664275 +- kind: conda + name: multiprocess + version: 0.70.15 + build: py312h02f2b3b_1 + build_number: 1 + subdir: osx-arm64 + url: https://conda.anaconda.org/conda-forge/osx-arm64/multiprocess-0.70.15-py312h02f2b3b_1.conda + sha256: 8041371e3ec3fbc2ca13c71b0180672896e6382e62892d9f6b11a4c5dd675951 + md5: 910ef2223c71902175418d9163152788 + depends: + - dill >=0.3.6 + - python >=3.12.0rc3,<3.13.0a0 + - python >=3.12.0rc3,<3.13.0a0 *_cpython + - python_abi 3.12.* *_cp312 + license: BSD-3-Clause + license_family: BSD + size: 335147 + timestamp: 1695459275360 +- kind: conda + name: mypy_extensions + version: 1.0.0 + build: pyha770c72_1 + build_number: 1 + subdir: noarch + noarch: python + url: https://conda.anaconda.org/conda-forge/noarch/mypy_extensions-1.0.0-pyha770c72_1.conda + sha256: 1895f47b7d68581a6facde5cb13ab8c2764c2e53a76bd746f8f98910dc4e08fe + md5: 29097e7ea634a45cc5386b95cac6568f + depends: + - python >=3.9 + license: MIT + license_family: MIT + size: 10854 + timestamp: 1733230986902 +- kind: conda + name: ncurses + version: '6.5' + build: h7bae524_1 + build_number: 1 + subdir: osx-arm64 + url: https://conda.anaconda.org/conda-forge/osx-arm64/ncurses-6.5-h7bae524_1.conda + sha256: 27d0b9ff78ad46e1f3a6c96c479ab44beda5f96def88e2fe626e0a49429d8afc + md5: cb2b0ea909b97b3d70cd3921d1445e1a + depends: + - __osx >=11.0 + license: X11 AND BSD-3-Clause + size: 802321 + timestamp: 1724658775723 +- kind: conda + name: numpy + version: 1.26.4 + build: py312h8442bc7_0 + subdir: osx-arm64 + url: https://conda.anaconda.org/conda-forge/osx-arm64/numpy-1.26.4-py312h8442bc7_0.conda + sha256: c8841d6d6f61fd70ca80682efbab6bdb8606dc77c68d8acabfbd7c222054f518 + md5: d83fc83d589e2625a3451c9a7e21047c + depends: + - libblas >=3.9.0,<4.0a0 + - libcblas >=3.9.0,<4.0a0 + - libcxx >=16 + - liblapack >=3.9.0,<4.0a0 + - python >=3.12,<3.13.0a0 + - python >=3.12,<3.13.0a0 *_cpython + - python_abi 3.12.* *_cp312 + constrains: + - numpy-base <0a0 + license: BSD-3-Clause + license_family: BSD + size: 6073136 + timestamp: 1707226249608 +- kind: conda + name: openjpeg + version: 2.5.3 + build: h8a3d83b_0 + subdir: osx-arm64 + url: https://conda.anaconda.org/conda-forge/osx-arm64/openjpeg-2.5.3-h8a3d83b_0.conda + sha256: 1d59bc72ca7faac06d349c1a280f5cfb8a57ee5896f1e24225a997189d7418c7 + md5: 4b71d78648dbcf68ce8bf22bb07ff838 + depends: + - __osx >=11.0 + - libcxx >=18 + - libpng >=1.6.44,<1.7.0a0 + - libtiff >=4.7.0,<4.8.0a0 + - libzlib >=1.3.1,<2.0a0 + license: BSD-2-Clause + license_family: BSD + size: 319362 + timestamp: 1733816781741 +- kind: conda + name: openssl + version: 3.4.0 + build: h81ee809_1 + build_number: 1 + subdir: osx-arm64 + url: https://conda.anaconda.org/conda-forge/osx-arm64/openssl-3.4.0-h81ee809_1.conda + sha256: 97772762abc70b3a537683ca9fc3ff3d6099eb64e4aba3b9c99e6fce48422d21 + md5: 22f971393637480bda8c679f374d8861 + depends: + - __osx >=11.0 + - ca-certificates + license: Apache-2.0 + license_family: Apache + size: 2936415 + timestamp: 1736086108693 +- kind: conda + name: opentelemetry-api + version: 1.29.0 + build: pyhd8ed1ab_1 + build_number: 1 + subdir: noarch + noarch: python + url: https://conda.anaconda.org/conda-forge/noarch/opentelemetry-api-1.29.0-pyhd8ed1ab_1.conda + sha256: 296280c8ace35c0a1cf72bed1077f248b3af903c3bf92332f1783a207cb5abdb + md5: 307b05402c1a382f2f09426492dee8f8 + depends: + - deprecated >=1.2.6 + - importlib-metadata >=6.0,<=8.5.0 + - python >=3.9 + license: Apache-2.0 + license_family: APACHE + size: 44166 + timestamp: 1734132973331 +- kind: conda + name: opentelemetry-exporter-otlp-proto-common + version: 1.29.0 + build: pyhd8ed1ab_0 + subdir: noarch + noarch: python + url: https://conda.anaconda.org/conda-forge/noarch/opentelemetry-exporter-otlp-proto-common-1.29.0-pyhd8ed1ab_0.conda + sha256: ae9776efe52564e0d6711cfcee7c54439273e57a3999f7f796f66e862f58aae9 + md5: 0c02e74d26bce3fec93b227cf7ea6e6b + depends: + - backoff >=1.10.0,<3.0.0 + - opentelemetry-proto 1.29.0 + - python >=3.9 + license: Apache-2.0 + license_family: APACHE + size: 18922 + timestamp: 1734310457116 +- kind: conda + name: opentelemetry-exporter-otlp-proto-http + version: 1.29.0 + build: pyhd8ed1ab_1 + build_number: 1 + subdir: noarch + noarch: python + url: https://conda.anaconda.org/conda-forge/noarch/opentelemetry-exporter-otlp-proto-http-1.29.0-pyhd8ed1ab_1.conda + sha256: 5d61db9d5b4f91b3932f5f2348920d5b7fdaa09e52c8ea054cf7bf3f21677c9c + md5: 223f4e56a29601c887f0dc467034af5b + depends: + - deprecated >=1.2.6 + - googleapis-common-protos >=1.52,<2.dev0 + - opentelemetry-api >=1.15,<2.dev0 + - opentelemetry-exporter-otlp-proto-common 1.29.0 + - opentelemetry-proto 1.29.0 + - opentelemetry-sdk 1.29.0 + - python >=3.9 + - requests >=2.7,<3.dev0 + license: Apache-2.0 + license_family: APACHE + size: 17147 + timestamp: 1734345675510 +- kind: conda + name: opentelemetry-exporter-prometheus + version: 1.12.0rc1 + build: pyhd8ed1ab_0 + subdir: noarch + noarch: python + url: https://conda.anaconda.org/conda-forge/noarch/opentelemetry-exporter-prometheus-1.12.0rc1-pyhd8ed1ab_0.conda + sha256: b8239230dbbdb491401e41b53bd9f21d60551cedef1a8d5807fca1bf9bdd331c + md5: 1ddc95052b31147d1e10d818cf519cf5 + depends: + - opentelemetry-api >=1.10.0 + - opentelemetry-sdk >=1.10.0 + - prometheus_client >=0.5.0,<1.0.0 + - python >=3.6 + license: Apache-2.0 + license_family: APACHE + size: 14721 + timestamp: 1695214221489 +- kind: conda + name: opentelemetry-proto + version: 1.29.0 + build: pyhd8ed1ab_0 + subdir: noarch + noarch: python + url: https://conda.anaconda.org/conda-forge/noarch/opentelemetry-proto-1.29.0-pyhd8ed1ab_0.conda + sha256: 200a7cb8acc8a0ddd6ef55c5460cec871b6a265929b240a0296c0ccb9c8d9758 + md5: e2a6d2ad10b813c7fdc1c64aac376128 + depends: + - protobuf <6.0,>=5.0 + - python >=3.9 + license: Apache-2.0 + license_family: APACHE + size: 37235 + timestamp: 1734291034372 +- kind: conda + name: opentelemetry-sdk + version: 1.29.0 + build: pyhd8ed1ab_0 + subdir: noarch + noarch: python + url: https://conda.anaconda.org/conda-forge/noarch/opentelemetry-sdk-1.29.0-pyhd8ed1ab_0.conda + sha256: 7b36629d8b8be8a019fcfd1518d7b7f862dd25de96f8adcadb93e4fd12cf9bd6 + md5: 2a8893f06e6ebda4bfa78875bc923ea4 + depends: + - opentelemetry-api 1.29.0 + - opentelemetry-semantic-conventions 0.50b0 + - python >=3.9 + - typing-extensions >=3.7.4 + - typing_extensions >=3.7.4 + license: Apache-2.0 + license_family: APACHE + size: 77645 + timestamp: 1734297838999 +- kind: conda + name: opentelemetry-semantic-conventions + version: 0.50b0 + build: pyh3cfb1c2_0 + subdir: noarch + noarch: python + url: https://conda.anaconda.org/conda-forge/noarch/opentelemetry-semantic-conventions-0.50b0-pyh3cfb1c2_0.conda + sha256: 6526e70368d5bf66ef0eaa51fb800d53782dde71a24bd38f40139919a6f784dc + md5: f7111fa4188d646c8108e232d024cb99 + depends: + - deprecated >=1.2.6 + - opentelemetry-api 1.29.0 + - python >=3.9 + license: Apache-2.0 + license_family: APACHE + size: 86084 + timestamp: 1734208980168 +- kind: conda + name: orc + version: 2.0.3 + build: h0ff2369_2 + build_number: 2 + subdir: osx-arm64 + url: https://conda.anaconda.org/conda-forge/osx-arm64/orc-2.0.3-h0ff2369_2.conda + sha256: cca330695f3bdb8c0e46350c29cd4af3345865544e36f1d7c9ba9190ad22f5f4 + md5: 24b1897c0d24afbb70704ba998793b78 + depends: + - __osx >=11.0 + - libcxx >=18 + - libprotobuf >=5.28.3,<5.28.4.0a0 + - libzlib >=1.3.1,<2.0a0 + - lz4-c >=1.10.0,<1.11.0a0 + - snappy >=1.2.1,<1.3.0a0 + - tzdata + - zstd >=1.5.6,<1.6.0a0 + license: Apache-2.0 + license_family: Apache + size: 438520 + timestamp: 1735630624140 +- kind: conda + name: packaging + version: '24.2' + build: pyhd8ed1ab_2 + build_number: 2 + subdir: noarch + noarch: python + url: https://conda.anaconda.org/conda-forge/noarch/packaging-24.2-pyhd8ed1ab_2.conda + sha256: da157b19bcd398b9804c5c52fc000fcb8ab0525bdb9c70f95beaa0bb42f85af1 + md5: 3bfed7e6228ebf2f7b9eaa47f1b4e2aa + depends: + - python >=3.8 + license: Apache-2.0 + license_family: APACHE + size: 60164 + timestamp: 1733203368787 +- kind: conda + name: pandas + version: 2.2.3 + build: py312hcd31e36_1 + build_number: 1 + subdir: osx-arm64 + url: https://conda.anaconda.org/conda-forge/osx-arm64/pandas-2.2.3-py312hcd31e36_1.conda + sha256: ff0cb54b5d058c7987b4a0984066e893642d1865a7bb695294b6172e2fcdc457 + md5: c68bfa69e6086c381c74e16fd72613a8 + depends: + - __osx >=11.0 + - libcxx >=17 + - numpy >=1.19,<3 + - numpy >=1.22.4 + - python >=3.12,<3.13.0a0 + - python >=3.12,<3.13.0a0 *_cpython + - python-dateutil >=2.8.1 + - python-tzdata >=2022a + - python_abi 3.12.* *_cp312 + - pytz >=2020.1,<2024.2 + license: BSD-3-Clause + license_family: BSD + size: 14470437 + timestamp: 1726878887799 +- kind: conda + name: pathspec + version: 0.12.1 + build: pyhd8ed1ab_1 + build_number: 1 + subdir: noarch + noarch: python + url: https://conda.anaconda.org/conda-forge/noarch/pathspec-0.12.1-pyhd8ed1ab_1.conda + sha256: 9f64009cdf5b8e529995f18e03665b03f5d07c0b17445b8badef45bde76249ee + md5: 617f15191456cc6a13db418a275435e5 + depends: + - python >=3.9 + license: MPL-2.0 + license_family: MOZILLA + size: 41075 + timestamp: 1733233471940 +- kind: conda + name: pillow + version: 11.1.0 + build: py312h50aef2c_0 + subdir: osx-arm64 + url: https://conda.anaconda.org/conda-forge/osx-arm64/pillow-11.1.0-py312h50aef2c_0.conda + sha256: b29b7c915053e06a7a5b4118760202c572c9c35d23bd6ce8e73270b6a50e50ee + md5: 94d6ba8cd468668a9fb04193b0f4b36e + depends: + - __osx >=11.0 + - freetype >=2.12.1,<3.0a0 + - lcms2 >=2.16,<3.0a0 + - libjpeg-turbo >=3.0.0,<4.0a0 + - libtiff >=4.7.0,<4.8.0a0 + - libwebp-base >=1.5.0,<2.0a0 + - libxcb >=1.17.0,<2.0a0 + - libzlib >=1.3.1,<2.0a0 + - openjpeg >=2.5.3,<3.0a0 + - python >=3.12,<3.13.0a0 + - python >=3.12,<3.13.0a0 *_cpython + - python_abi 3.12.* *_cp312 + - tk >=8.6.13,<8.7.0a0 + license: HPND + size: 42852329 + timestamp: 1735930118976 +- kind: conda + name: platformdirs + version: 4.3.6 + build: pyhd8ed1ab_1 + build_number: 1 + subdir: noarch + noarch: python + url: https://conda.anaconda.org/conda-forge/noarch/platformdirs-4.3.6-pyhd8ed1ab_1.conda + sha256: bb50f6499e8bc1d1a26f17716c97984671121608dc0c3ecd34858112bce59a27 + md5: 577852c7e53901ddccc7e6a9959ddebe + depends: + - python >=3.9 + license: MIT + license_family: MIT + size: 20448 + timestamp: 1733232756001 +- kind: conda + name: prometheus_client + version: 0.21.1 + build: pyhd8ed1ab_0 + subdir: noarch + noarch: python + url: https://conda.anaconda.org/conda-forge/noarch/prometheus_client-0.21.1-pyhd8ed1ab_0.conda + sha256: bc8f00d5155deb7b47702cb8370f233935704100dbc23e30747c161d1b6cf3ab + md5: 3e01e386307acc60b2f89af0b2e161aa + depends: + - python >=3.9 + license: Apache-2.0 + license_family: Apache + size: 49002 + timestamp: 1733327434163 +- kind: conda + name: propcache + version: 0.2.1 + build: py312hea69d52_0 + subdir: osx-arm64 + url: https://conda.anaconda.org/conda-forge/osx-arm64/propcache-0.2.1-py312hea69d52_0.conda + sha256: f8c266c494aa1e4cfb8bf0b6fca060044b2f3d65afe4c5062ebeea382e77aa6d + md5: c84e3dd97fe25a17322c4a0f670c6750 + depends: + - __osx >=11.0 + - python >=3.12,<3.13.0a0 + - python >=3.12,<3.13.0a0 *_cpython + - python_abi 3.12.* *_cp312 + license: Apache-2.0 + license_family: APACHE + size: 48225 + timestamp: 1733392308901 +- kind: conda + name: protobuf + version: 5.28.3 + build: py312hd8f9ff3_0 + subdir: osx-arm64 + url: https://conda.anaconda.org/conda-forge/osx-arm64/protobuf-5.28.3-py312hd8f9ff3_0.conda + sha256: 9d572a97419bdace14d7c7cc8cc8c4bf2dcb22b56965dac87a27fbdb5061b926 + md5: 5afbe52a59f04dd1fe566d0d17590d7e + depends: + - __osx >=11.0 + - libcxx >=18 + - python >=3.12,<3.13.0a0 + - python >=3.12,<3.13.0a0 *_cpython + - python_abi 3.12.* *_cp312 + constrains: + - libprotobuf 5.28.3 + license: BSD-3-Clause + license_family: BSD + size: 448803 + timestamp: 1731367010746 +- kind: conda + name: pthread-stubs + version: '0.4' + build: hd74edd7_1002 + build_number: 1002 + subdir: osx-arm64 + url: https://conda.anaconda.org/conda-forge/osx-arm64/pthread-stubs-0.4-hd74edd7_1002.conda + sha256: 8ed65e17fbb0ca944bfb8093b60086e3f9dd678c3448b5de212017394c247ee3 + md5: 415816daf82e0b23a736a069a75e9da7 + depends: + - __osx >=11.0 + license: MIT + license_family: MIT + size: 8381 + timestamp: 1726802424786 +- kind: conda + name: pyarrow + version: 18.1.0 + build: py312h1f38498_0 + subdir: osx-arm64 + url: https://conda.anaconda.org/conda-forge/osx-arm64/pyarrow-18.1.0-py312h1f38498_0.conda + sha256: 06c0e208d5bf15051874097366c8e8e5db176dffba38526f227a34e80cc8e9bc + md5: 3710616b880b31d0c8afd8ae7e12392a + depends: + - libarrow-acero 18.1.0.* + - libarrow-dataset 18.1.0.* + - libarrow-substrait 18.1.0.* + - libparquet 18.1.0.* + - pyarrow-core 18.1.0 *_0_* + - python >=3.12,<3.13.0a0 + - python_abi 3.12.* *_cp312 + license: Apache-2.0 + license_family: APACHE + size: 25375 + timestamp: 1732610892198 +- kind: conda + name: pyarrow-core + version: 18.1.0 + build: py312hc40f475_0_cpu + subdir: osx-arm64 + url: https://conda.anaconda.org/conda-forge/osx-arm64/pyarrow-core-18.1.0-py312hc40f475_0_cpu.conda + sha256: 063eb168a29d4ce6d9ed865e9e1ad3b6e141712189955a79e06b24ddc0cbbc9c + md5: 9859e7c4b94bbf69772dbf0511101cec + depends: + - __osx >=11.0 + - libarrow 18.1.0.* *cpu + - libcxx >=18 + - libzlib >=1.3.1,<2.0a0 + - python >=3.12,<3.13.0a0 + - python >=3.12,<3.13.0a0 *_cpython + - python_abi 3.12.* *_cp312 + constrains: + - numpy >=1.21,<3 + - apache-arrow-proc =*=cpu + license: Apache-2.0 + license_family: APACHE + size: 3909116 + timestamp: 1732610863261 +- kind: conda + name: pycparser + version: '2.22' + build: pyh29332c3_1 + build_number: 1 + subdir: noarch + noarch: python + url: https://conda.anaconda.org/conda-forge/noarch/pycparser-2.22-pyh29332c3_1.conda + sha256: 79db7928d13fab2d892592223d7570f5061c192f27b9febd1a418427b719acc6 + md5: 12c566707c80111f9799308d9e265aef + depends: + - python >=3.9 + - python + license: BSD-3-Clause + license_family: BSD + size: 110100 + timestamp: 1733195786147 +- kind: conda + name: pydantic + version: 2.10.4 + build: pyh3cfb1c2_0 + subdir: noarch + noarch: python + url: https://conda.anaconda.org/conda-forge/noarch/pydantic-2.10.4-pyh3cfb1c2_0.conda + sha256: e68400714532a33f34b44ddaee3e27e8dd6c83c3f31c7892ec10b84d13aa8b59 + md5: 93bccf4d7a58c9140d59491de21e044b + depends: + - annotated-types >=0.6.0 + - pydantic-core 2.27.2 + - python >=3.9 + - typing-extensions >=4.6.1 + - typing_extensions >=4.12.2 + license: MIT + license_family: MIT + size: 296557 + timestamp: 1734609427697 +- kind: conda + name: pydantic-core + version: 2.27.2 + build: py312hcd83bfe_0 + subdir: osx-arm64 + url: https://conda.anaconda.org/conda-forge/osx-arm64/pydantic-core-2.27.2-py312hcd83bfe_0.conda + sha256: cfa7201f890d5d08ce29ff70e65a96787d5793a1718776733666b44bbd4a1205 + md5: dcb307e02f17d38c6e1cbfbf8c602852 + depends: + - __osx >=11.0 + - python >=3.12,<3.13.0a0 + - python >=3.12,<3.13.0a0 *_cpython + - python_abi 3.12.* *_cp312 + - typing-extensions >=4.6.0,!=4.7.0 + constrains: + - __osx >=11.0 + license: MIT + license_family: MIT + size: 1593461 + timestamp: 1734571986644 +- kind: conda + name: pydantic-settings + version: 2.7.1 + build: pyh3cfb1c2_0 + subdir: noarch + noarch: python + url: https://conda.anaconda.org/conda-forge/noarch/pydantic-settings-2.7.1-pyh3cfb1c2_0.conda + sha256: 082fb1ec29917d2c9ed6a862cb8eb9beb88c208ea62c9fef1aeb5f4f3e0e0b06 + md5: d71d76b62bed332b037d7adfc0f3989a + depends: + - pydantic >=2.7.0 + - python >=3.9 + - python-dotenv >=0.21.0 + license: MIT + license_family: MIT + size: 31822 + timestamp: 1735650532951 +- kind: conda + name: pygments + version: 2.18.0 + build: pyhd8ed1ab_1 + build_number: 1 + subdir: noarch + noarch: python + url: https://conda.anaconda.org/conda-forge/noarch/pygments-2.18.0-pyhd8ed1ab_1.conda + sha256: 0d6133545f268b2b89c2617c196fc791f365b538d4057ecd636d658c3b1e885d + md5: b38dc0206e2a530e5c2cf11dc086b31a + depends: + - python >=3.9 + license: BSD-2-Clause + license_family: BSD + size: 876700 + timestamp: 1733221731178 +- kind: conda + name: pyinstrument + version: 5.0.0 + build: py312h0bf5046_0 + subdir: osx-arm64 + url: https://conda.anaconda.org/conda-forge/osx-arm64/pyinstrument-5.0.0-py312h0bf5046_0.conda + sha256: 6879d52fb0ec2258e2850476786a652c394220d53883c53691ed5390183ae925 + md5: f0e4a98d54477083ddc9d2f33507f848 + depends: + - __osx >=11.0 + - python >=3.12,<3.13.0a0 + - python >=3.12,<3.13.0a0 *_cpython + - python_abi 3.12.* *_cp312 + license: BSD-3-Clause + license_family: BSD + size: 181512 + timestamp: 1728714205508 +- kind: conda + name: pysocks + version: 1.7.1 + build: pyha55dd90_7 + build_number: 7 + subdir: noarch + noarch: python + url: https://conda.anaconda.org/conda-forge/noarch/pysocks-1.7.1-pyha55dd90_7.conda + sha256: ba3b032fa52709ce0d9fd388f63d330a026754587a2f461117cac9ab73d8d0d8 + md5: 461219d1a5bd61342293efa2c0c90eac + depends: + - __unix + - python >=3.9 + license: BSD-3-Clause + license_family: BSD + size: 21085 + timestamp: 1733217331982 +- kind: conda + name: python + version: 3.12.8 + build: hc22306f_1_cpython + build_number: 1 + subdir: osx-arm64 + url: https://conda.anaconda.org/conda-forge/osx-arm64/python-3.12.8-hc22306f_1_cpython.conda + sha256: 7586a711b1b08a9df8864e26efdc06980bdfb0e18d5ac4651d0fee30a8d3e3a0 + md5: 54ca5b5d92ef3a3ba61e195ee882a518 + depends: + - __osx >=11.0 + - bzip2 >=1.0.8,<2.0a0 + - libexpat >=2.6.4,<3.0a0 + - libffi >=3.4,<4.0a0 + - liblzma >=5.6.3,<6.0a0 + - libsqlite >=3.47.0,<4.0a0 + - libzlib >=1.3.1,<2.0a0 + - ncurses >=6.5,<7.0a0 + - openssl >=3.4.0,<4.0a0 + - readline >=8.2,<9.0a0 + - tk >=8.6.13,<8.7.0a0 + - tzdata + constrains: + - python_abi 3.12.* *_cp312 + license: Python-2.0 + size: 12998673 + timestamp: 1733408900971 +- kind: conda + name: python-dateutil + version: 2.9.0.post0 + build: pyhff2d567_1 + build_number: 1 + subdir: noarch + noarch: python + url: https://conda.anaconda.org/conda-forge/noarch/python-dateutil-2.9.0.post0-pyhff2d567_1.conda + sha256: a50052536f1ef8516ed11a844f9413661829aa083304dc624c5925298d078d79 + md5: 5ba79d7c71f03c678c8ead841f347d6e + depends: + - python >=3.9 + - six >=1.5 + license: Apache-2.0 + license_family: APACHE + size: 222505 + timestamp: 1733215763718 +- kind: conda + name: python-dotenv + version: 1.0.1 + build: pyhd8ed1ab_1 + build_number: 1 + subdir: noarch + noarch: python + url: https://conda.anaconda.org/conda-forge/noarch/python-dotenv-1.0.1-pyhd8ed1ab_1.conda + sha256: 99713f6b534fef94995c6c16fd21d59f3548784e9111775d692bdc7c44678f02 + md5: e5c6ed218664802d305e79cc2d4491de + depends: + - python >=3.9 + license: BSD-3-Clause + license_family: BSD + size: 24215 + timestamp: 1733243277223 +- kind: conda + name: python-json-logger + version: 2.0.7 + build: pyhd8ed1ab_0 + subdir: noarch + noarch: python + url: https://conda.anaconda.org/conda-forge/noarch/python-json-logger-2.0.7-pyhd8ed1ab_0.conda + sha256: 4790787fe1f4e8da616edca4acf6a4f8ed4e7c6967aa31b920208fc8f95efcca + md5: a61bf9ec79426938ff785eb69dbb1960 + depends: + - python >=3.6 + license: BSD-2-Clause + license_family: BSD + size: 13383 + timestamp: 1677079727691 +- kind: conda + name: python-multipart + version: 0.0.20 + build: pyhff2d567_0 + subdir: noarch + noarch: python + url: https://conda.anaconda.org/conda-forge/noarch/python-multipart-0.0.20-pyhff2d567_0.conda + sha256: 1b03678d145b1675b757cba165a0d9803885807792f7eb4495e48a38858c3cca + md5: a28c984e0429aff3ab7386f7de56de6f + depends: + - python >=3.9 + license: Apache-2.0 + license_family: Apache + size: 27913 + timestamp: 1734420869885 +- kind: conda + name: python-tzdata + version: '2024.2' + build: pyhd8ed1ab_1 + build_number: 1 + subdir: noarch + noarch: python + url: https://conda.anaconda.org/conda-forge/noarch/python-tzdata-2024.2-pyhd8ed1ab_1.conda + sha256: 57c9a02ec25926fb48edca59b9ede107823e5d5c473b94a0e05cc0b9a193a642 + md5: c0def296b2f6d2dd7b030c2a7f66bb1f + depends: + - python >=3.9 + license: Apache-2.0 + license_family: APACHE + size: 142235 + timestamp: 1733235414217 +- kind: conda + name: python-xxhash + version: 3.5.0 + build: py312h024a12e_1 + build_number: 1 + subdir: osx-arm64 + url: https://conda.anaconda.org/conda-forge/osx-arm64/python-xxhash-3.5.0-py312h024a12e_1.conda + sha256: 28204ef48f028a4d872e22040da0dad7ebd703549b010a1bb511b6dd94cf466d + md5: 266fe1ae54a7bb17990206664d0f0ae4 + depends: + - __osx >=11.0 + - python >=3.12,<3.13.0a0 + - python >=3.12,<3.13.0a0 *_cpython + - python_abi 3.12.* *_cp312 + - xxhash >=0.8.2,<0.8.3.0a0 + license: BSD-2-Clause + license_family: BSD + size: 21765 + timestamp: 1725272382968 +- kind: conda + name: python_abi + version: '3.12' + build: 5_cp312 + build_number: 5 + subdir: osx-arm64 + url: https://conda.anaconda.org/conda-forge/osx-arm64/python_abi-3.12-5_cp312.conda + sha256: 49d624e4b809c799d2bf257b22c23cf3fc4460f5570d9a58e7ad86350aeaa1f4 + md5: b76f9b1c862128e56ac7aa8cd2333de9 + constrains: + - python 3.12.* *_cpython + license: BSD-3-Clause + license_family: BSD + size: 6278 + timestamp: 1723823099686 +- kind: conda + name: pytz + version: '2024.1' + build: pyhd8ed1ab_0 + subdir: noarch + noarch: python + url: https://conda.anaconda.org/conda-forge/noarch/pytz-2024.1-pyhd8ed1ab_0.conda + sha256: 1a7d6b233f7e6e3bbcbad054c8fd51e690a67b129a899a056a5e45dd9f00cb41 + md5: 3eeeeb9e4827ace8c0c1419c85d590ad + depends: + - python >=3.7 + license: MIT + license_family: MIT + size: 188538 + timestamp: 1706886944988 +- kind: conda + name: pyyaml + version: 6.0.2 + build: py312h024a12e_1 + build_number: 1 + subdir: osx-arm64 + url: https://conda.anaconda.org/conda-forge/osx-arm64/pyyaml-6.0.2-py312h024a12e_1.conda + sha256: b06f1c15fb39695bbf707ae8fb554b9a77519af577b5556784534c7db10b52e3 + md5: 1ee23620cf46cb15900f70a1300bae55 + depends: + - __osx >=11.0 + - python >=3.12,<3.13.0a0 + - python >=3.12,<3.13.0a0 *_cpython + - python_abi 3.12.* *_cp312 + - yaml >=0.2.5,<0.3.0a0 + license: MIT + license_family: MIT + size: 187143 + timestamp: 1725456547263 +- kind: conda + name: pyzmq + version: 26.2.0 + build: py312hf8a1cbd_3 + build_number: 3 + subdir: osx-arm64 + url: https://conda.anaconda.org/conda-forge/osx-arm64/pyzmq-26.2.0-py312hf8a1cbd_3.conda + sha256: 2e0ca1bb9ab3af5d1f9b38548d65be7097ba0246e7e63c908c9b1323df3f45b5 + md5: 7bdaa4c2a84b744ef26c8b2ba65c3d0e + depends: + - __osx >=11.0 + - libcxx >=17 + - libsodium >=1.0.20,<1.0.21.0a0 + - python >=3.12,<3.13.0a0 + - python >=3.12,<3.13.0a0 *_cpython + - python_abi 3.12.* *_cp312 + - zeromq >=4.3.5,<4.4.0a0 + license: BSD-3-Clause + license_family: BSD + size: 361674 + timestamp: 1728642457661 +- kind: conda + name: re2 + version: 2024.07.02 + build: h6589ca4_2 + build_number: 2 + subdir: osx-arm64 + url: https://conda.anaconda.org/conda-forge/osx-arm64/re2-2024.07.02-h6589ca4_2.conda + sha256: 4d3799c05f8f662922a0acd129d119774760a3281b883603678e128d1cb307fb + md5: 7a8b4ad8c58a3408ca89d78788c78178 + depends: + - libre2-11 2024.07.02 h07bc746_2 + license: BSD-3-Clause + license_family: BSD + size: 26861 + timestamp: 1735541088455 +- kind: conda + name: readline + version: '8.2' + build: h92ec313_1 + build_number: 1 + subdir: osx-arm64 + url: https://conda.anaconda.org/conda-forge/osx-arm64/readline-8.2-h92ec313_1.conda + sha256: a1dfa679ac3f6007362386576a704ad2d0d7a02e98f5d0b115f207a2da63e884 + md5: 8cbb776a2f641b943d413b3e19df71f4 + depends: + - ncurses >=6.3,<7.0a0 + license: GPL-3.0-only + license_family: GPL + size: 250351 + timestamp: 1679532511311 +- kind: conda + name: regex + version: 2024.11.6 + build: py312hea69d52_0 + subdir: osx-arm64 + url: https://conda.anaconda.org/conda-forge/osx-arm64/regex-2024.11.6-py312hea69d52_0.conda + sha256: dcdec32f2c7dd37986baa692bedf9db126ad34e92e5e9b64f707cba3d04d2525 + md5: e73cda1f18846b608284bd784f061eac + depends: + - __osx >=11.0 + - python >=3.12,<3.13.0a0 + - python >=3.12,<3.13.0a0 *_cpython + - python_abi 3.12.* *_cp312 + license: Python-2.0 + license_family: PSF + size: 366374 + timestamp: 1730952427552 +- kind: conda + name: requests + version: 2.32.3 + build: pyhd8ed1ab_1 + build_number: 1 + subdir: noarch + noarch: python + url: https://conda.anaconda.org/conda-forge/noarch/requests-2.32.3-pyhd8ed1ab_1.conda + sha256: d701ca1136197aa121bbbe0e8c18db6b5c94acbd041c2b43c70e5ae104e1d8ad + md5: a9b9368f3701a417eac9edbcae7cb737 + depends: + - certifi >=2017.4.17 + - charset-normalizer >=2,<4 + - idna >=2.5,<4 + - python >=3.9 + - urllib3 >=1.21.1,<3 + constrains: + - chardet >=3.0.2,<6 + license: Apache-2.0 + license_family: APACHE + size: 58723 + timestamp: 1733217126197 +- kind: conda + name: rich + version: 13.9.4 + build: pyhd8ed1ab_1 + build_number: 1 + subdir: noarch + noarch: python + url: https://conda.anaconda.org/conda-forge/noarch/rich-13.9.4-pyhd8ed1ab_1.conda + sha256: 06a760c5ae572e72e865d5a87e9fe3cc171e1a9c996e63daf3db52ff1a0b4457 + md5: 7aed65d4ff222bfb7335997aa40b7da5 + depends: + - markdown-it-py >=2.2.0 + - pygments >=2.13.0,<3.0.0 + - python >=3.9 + - typing_extensions >=4.0.0,<5.0.0 + license: MIT + license_family: MIT + size: 185646 + timestamp: 1733342347277 +- kind: conda + name: rich-toolkit + version: 0.11.3 + build: pyh29332c3_0 + subdir: noarch + noarch: python + url: https://conda.anaconda.org/conda-forge/noarch/rich-toolkit-0.11.3-pyh29332c3_0.conda + sha256: e558f8c254a9ff9164d069110da162fc79497d70c60f2c09a5d3d0d7101c5628 + md5: 4ba15ae9388b67d09782798347481f69 + depends: + - python >=3.9 + - rich >=13.7.1 + - click >=8.1.7 + - typing_extensions >=4.12.2 + - python + license: MIT + license_family: MIT + size: 17357 + timestamp: 1733750834072 +- kind: conda + name: safetensors + version: 0.5.0 + build: py312hcd83bfe_0 + subdir: osx-arm64 + url: https://conda.anaconda.org/conda-forge/osx-arm64/safetensors-0.5.0-py312hcd83bfe_0.conda + sha256: 8992f78362793a465c3009be2fd80582c93e2151bc17d07ebd39ce7af757358a + md5: acbbbac2271653f4914cef842a84190f + depends: + - __osx >=11.0 + - python >=3.12,<3.13.0a0 + - python >=3.12,<3.13.0a0 *_cpython + - python_abi 3.12.* *_cp312 + constrains: + - __osx >=11.0 + license: Apache-2.0 + license_family: APACHE + size: 377533 + timestamp: 1735918206452 +- kind: conda + name: shellingham + version: 1.5.4 + build: pyhd8ed1ab_1 + build_number: 1 + subdir: noarch + noarch: python + url: https://conda.anaconda.org/conda-forge/noarch/shellingham-1.5.4-pyhd8ed1ab_1.conda + sha256: 0557c090913aa63cdbe821dbdfa038a321b488e22bc80196c4b3b1aace4914ef + md5: 7c3c2a0f3ebdea2bbc35538d162b43bf + depends: + - python >=3.9 + license: MIT + license_family: MIT + size: 14462 + timestamp: 1733301007770 +- kind: conda + name: six + version: 1.17.0 + build: pyhd8ed1ab_0 + subdir: noarch + noarch: python + url: https://conda.anaconda.org/conda-forge/noarch/six-1.17.0-pyhd8ed1ab_0.conda + sha256: 41db0180680cc67c3fa76544ffd48d6a5679d96f4b71d7498a759e94edc9a2db + md5: a451d576819089b0d672f18768be0f65 + depends: + - python >=3.9 + license: MIT + license_family: MIT + size: 16385 + timestamp: 1733381032766 +- kind: conda + name: small_time + version: 0.1.3 + build: h60d57d3_0 + subdir: osx-arm64 + url: https://repo.prefix.dev/mojo-community/osx-arm64/small_time-0.1.3-h60d57d3_0.conda + sha256: 8f08a189fa15d96e6dc8b0cc49aecaefe9caf5a8209ca3ab5d2da91b7e13a3ba + depends: + - max >=24.5.0,<25 + arch: arm64 + platform: osx + license: MIT + size: 404869 + timestamp: 1726265944269 +- kind: conda + name: snappy + version: 1.2.1 + build: h98b9ce2_1 + build_number: 1 + subdir: osx-arm64 + url: https://conda.anaconda.org/conda-forge/osx-arm64/snappy-1.2.1-h98b9ce2_1.conda + sha256: 4242f95b215127a006eb664fe26ed5a82df87e90cbdbc7ce7ff4971f0720997f + md5: ded86dee325290da2967a3fea3800eb5 + depends: + - __osx >=11.0 + - libcxx >=18 + license: BSD-3-Clause + license_family: BSD + size: 35857 + timestamp: 1733502172664 +- kind: conda + name: sniffio + version: 1.3.1 + build: pyhd8ed1ab_1 + build_number: 1 + subdir: noarch + noarch: python + url: https://conda.anaconda.org/conda-forge/noarch/sniffio-1.3.1-pyhd8ed1ab_1.conda + sha256: c2248418c310bdd1719b186796ae50a8a77ce555228b6acd32768e2543a15012 + md5: bf7a226e58dfb8346c70df36065d86c9 + depends: + - python >=3.9 + license: Apache-2.0 + license_family: Apache + size: 15019 + timestamp: 1733244175724 +- kind: conda + name: sse-starlette + version: 2.2.1 + build: pyhd8ed1ab_0 + subdir: noarch + noarch: python + url: https://conda.anaconda.org/conda-forge/noarch/sse-starlette-2.2.1-pyhd8ed1ab_0.conda + sha256: 3c6a476e7afb702d841e23c61a0c4cc491929d2e39376d329e67e94c40a236cc + md5: c1ef6bc13dd2caa4b406fb3cb06c2791 + depends: + - anyio >=4.7.0 + - python >=3.9 + - starlette >=0.41.3 + license: BSD-3-Clause + license_family: BSD + size: 15324 + timestamp: 1735126414893 +- kind: conda + name: starlette + version: 0.41.3 + build: pyha770c72_1 + build_number: 1 + subdir: noarch + noarch: python + url: https://conda.anaconda.org/conda-forge/noarch/starlette-0.41.3-pyha770c72_1.conda + sha256: b74fc76107487eb26624c01fc55bfab7eed03ae82e003333c86d8a1eeac53672 + md5: 0207dac04ae2200701fab697f0aaaac4 + depends: + - anyio >=3.4.0,<5 + - python >=3.9 + - typing_extensions >=3.10.0 + license: BSD-3-Clause + license_family: BSD + size: 58838 + timestamp: 1733344472634 - kind: conda - name: ncurses - version: '6.5' - build: h7bae524_1 + name: tk + version: 8.6.13 + build: h5083fa2_1 build_number: 1 subdir: osx-arm64 - url: https://conda.anaconda.org/conda-forge/osx-arm64/ncurses-6.5-h7bae524_1.conda - sha256: 27d0b9ff78ad46e1f3a6c96c479ab44beda5f96def88e2fe626e0a49429d8afc - md5: cb2b0ea909b97b3d70cd3921d1445e1a + url: https://conda.anaconda.org/conda-forge/osx-arm64/tk-8.6.13-h5083fa2_1.conda + sha256: 72457ad031b4c048e5891f3f6cb27a53cb479db68a52d965f796910e71a403a8 + md5: b50a57ba89c32b62428b71a875291c9b depends: - - __osx >=11.0 - license: X11 AND BSD-3-Clause - size: 802321 - timestamp: 1724658775723 + - libzlib >=1.2.13,<2.0.0a0 + license: TCL + license_family: BSD + size: 3145523 + timestamp: 1699202432999 - kind: conda - name: numpy - version: 1.26.4 - build: py312h8442bc7_0 + name: tokenizers + version: 0.21.0 + build: py312hf3e4074_0 subdir: osx-arm64 - url: https://conda.anaconda.org/conda-forge/osx-arm64/numpy-1.26.4-py312h8442bc7_0.conda - sha256: c8841d6d6f61fd70ca80682efbab6bdb8606dc77c68d8acabfbd7c222054f518 - md5: d83fc83d589e2625a3451c9a7e21047c + url: https://conda.anaconda.org/conda-forge/osx-arm64/tokenizers-0.21.0-py312hf3e4074_0.conda + sha256: 5d395333fcb22dc611140286c1f2ea8b3fa220a4931c583587cb612238091555 + md5: 4c732c74b485ef7ac8ec1c548dd45e8e depends: - - libblas >=3.9.0,<4.0a0 - - libcblas >=3.9.0,<4.0a0 - - libcxx >=16 - - liblapack >=3.9.0,<4.0a0 + - __osx >=11.0 + - huggingface_hub >=0.16.4,<1.0 + - libcxx >=18 - python >=3.12,<3.13.0a0 - python >=3.12,<3.13.0a0 *_cpython - python_abi 3.12.* *_cp312 constrains: - - numpy-base <0a0 - license: BSD-3-Clause - license_family: BSD - size: 6073136 - timestamp: 1707226249608 + - __osx >=11.0 + license: Apache-2.0 + license_family: APACHE + size: 1931389 + timestamp: 1732734727624 - kind: conda - name: openssl - version: 3.3.2 - build: h8359307_0 + name: tornado + version: 6.4.2 + build: py312hea69d52_0 subdir: osx-arm64 - url: https://conda.anaconda.org/conda-forge/osx-arm64/openssl-3.3.2-h8359307_0.conda - sha256: 940fa01c4dc6152158fe8943e05e55a1544cab639df0994e3b35937839e4f4d1 - md5: 1773ebccdc13ec603356e8ff1db9e958 + url: https://conda.anaconda.org/conda-forge/osx-arm64/tornado-6.4.2-py312hea69d52_0.conda + sha256: 964a2705a36c50040c967b18b45b9cc8de3c2aff4af546979a574e0b38e58e39 + md5: fb0605888a475d6a380ae1d1a819d976 depends: - __osx >=11.0 - - ca-certificates + - python >=3.12,<3.13.0a0 + - python >=3.12,<3.13.0a0 *_cpython + - python_abi 3.12.* *_cp312 license: Apache-2.0 license_family: Apache - size: 2882450 - timestamp: 1725410638874 + size: 842549 + timestamp: 1732616081362 - kind: conda - name: packaging - version: '24.1' + name: tqdm + version: 4.67.1 + build: pyhd8ed1ab_1 + build_number: 1 + subdir: noarch + noarch: python + url: https://conda.anaconda.org/conda-forge/noarch/tqdm-4.67.1-pyhd8ed1ab_1.conda + sha256: 11e2c85468ae9902d24a27137b6b39b4a78099806e551d390e394a8c34b48e40 + md5: 9efbfdc37242619130ea42b1cc4ed861 + depends: + - colorama + - python >=3.9 + license: MPL-2.0 or MIT + size: 89498 + timestamp: 1735661472632 +- kind: conda + name: traitlets + version: 5.14.3 + build: pyhd8ed1ab_1 + build_number: 1 + subdir: noarch + noarch: python + url: https://conda.anaconda.org/conda-forge/noarch/traitlets-5.14.3-pyhd8ed1ab_1.conda + sha256: f39a5620c6e8e9e98357507262a7869de2ae8cc07da8b7f84e517c9fd6c2b959 + md5: 019a7385be9af33791c989871317e1ed + depends: + - python >=3.9 + license: BSD-3-Clause + license_family: BSD + size: 110051 + timestamp: 1733367480074 +- kind: conda + name: transformers + version: 4.47.1 build: pyhd8ed1ab_0 subdir: noarch noarch: python - url: https://conda.anaconda.org/conda-forge/noarch/packaging-24.1-pyhd8ed1ab_0.conda - sha256: 36aca948219e2c9fdd6d80728bcc657519e02f06c2703d8db3446aec67f51d81 - md5: cbe1bb1f21567018ce595d9c2be0f0db + url: https://conda.anaconda.org/conda-forge/noarch/transformers-4.47.1-pyhd8ed1ab_0.conda + sha256: df8238c3cccbb6bb1d5657e6a75977ac0b832ab61155d5e3d8560c1c4f52abeb + md5: 931d66db156680c42c62812d6533cbf7 depends: - - python >=3.8 + - datasets !=2.5.0 + - filelock + - huggingface_hub >=0.23.0,<1.0 + - numpy >=1.17 + - packaging >=20.0 + - python >=3.9 + - pyyaml >=5.1 + - regex !=2019.12.17 + - requests + - safetensors >=0.4.1 + - tokenizers >=0.21,<0.22 + - tqdm >=4.27 license: Apache-2.0 license_family: APACHE - size: 50290 - timestamp: 1718189540074 + size: 3680276 + timestamp: 1734499046193 - kind: conda - name: pathspec - version: 0.12.1 + name: typer + version: 0.15.1 build: pyhd8ed1ab_0 subdir: noarch noarch: python - url: https://conda.anaconda.org/conda-forge/noarch/pathspec-0.12.1-pyhd8ed1ab_0.conda - sha256: 4e534e66bfe8b1e035d2169d0e5b185450546b17e36764272863e22e0370be4d - md5: 17064acba08d3686f1135b5ec1b32b12 + url: https://conda.anaconda.org/conda-forge/noarch/typer-0.15.1-pyhd8ed1ab_0.conda + sha256: ef695490e895c2ad552c77ec497b899b09fd4ad4ab07edcf5649f5994cf92a35 + md5: 170a0398946d8f5b454e592672b6fc20 depends: - - python >=3.7 - license: MPL-2.0 - license_family: MOZILLA - size: 41173 - timestamp: 1702250135032 + - python >=3.9 + - typer-slim-standard 0.15.1 hd8ed1ab_0 + license: MIT + license_family: MIT + size: 56175 + timestamp: 1733408582623 - kind: conda - name: platformdirs - version: 4.3.3 + name: typer-slim + version: 0.15.1 build: pyhd8ed1ab_0 subdir: noarch noarch: python - url: https://conda.anaconda.org/conda-forge/noarch/platformdirs-4.3.3-pyhd8ed1ab_0.conda - sha256: 30d9448d38392cc6fcf0c1d515c85c75ecf6b4eaed0895efc1cac9e10cb57c51 - md5: 32ecde72bc26b834382b93d454c9a68d + url: https://conda.anaconda.org/conda-forge/noarch/typer-slim-0.15.1-pyhd8ed1ab_0.conda + sha256: d4965516f35e0805199de6596c4ac76c4ad3d6b012be35e532102f9e53ecb860 + md5: 0218b16f5a1dd569e575a7a6415489db depends: - - python >=3.8 + - click >=8.0.0 + - python >=3.9 + - typing_extensions >=3.7.4.3 + constrains: + - rich >=10.11.0 + - typer >=0.15.1,<0.15.2.0a0 + - shellingham >=1.3.0 license: MIT - size: 20578 - timestamp: 1726315538191 + license_family: MIT + size: 43592 + timestamp: 1733408569554 - kind: conda - name: python - version: 3.12.6 - build: h739c21a_0_cpython - subdir: osx-arm64 - url: https://conda.anaconda.org/conda-forge/osx-arm64/python-3.12.6-h739c21a_0_cpython.conda - sha256: 7dc75f4a7f800426e39ba219a1202c00b002cd0c792e34e077d3d7c145ef0199 - md5: 1d0f564edfc8121b35a4dc2d25b62863 + name: typer-slim-standard + version: 0.15.1 + build: hd8ed1ab_0 + subdir: noarch + noarch: generic + url: https://conda.anaconda.org/conda-forge/noarch/typer-slim-standard-0.15.1-hd8ed1ab_0.conda + sha256: f31c56fe98315da8b9ce848256c17e0b9f87896b41a6ccf0c9cc74644dcef20f + md5: 4e603c43bfdfc7b533be087c3e070cc9 depends: - - __osx >=11.0 - - bzip2 >=1.0.8,<2.0a0 - - libexpat >=2.6.3,<3.0a0 - - libffi >=3.4,<4.0a0 - - libsqlite >=3.46.1,<4.0a0 - - libzlib >=1.3.1,<2.0a0 - - ncurses >=6.5,<7.0a0 - - openssl >=3.3.2,<4.0a0 - - readline >=8.2,<9.0a0 - - tk >=8.6.13,<8.7.0a0 - - tzdata - - xz >=5.2.6,<6.0a0 - constrains: - - python_abi 3.12.* *_cp312 - license: Python-2.0 - size: 12877861 - timestamp: 1726030796871 + - rich + - shellingham + - typer-slim 0.15.1 pyhd8ed1ab_0 + license: MIT + license_family: MIT + size: 49531 + timestamp: 1733408570063 - kind: conda - name: python-dateutil - version: 2.9.0 + name: typing-extensions + version: 4.12.2 + build: hd8ed1ab_1 + build_number: 1 + subdir: noarch + noarch: python + url: https://conda.anaconda.org/conda-forge/noarch/typing-extensions-4.12.2-hd8ed1ab_1.conda + sha256: c8e9c1c467b5f960b627d7adc1c65fece8e929a3de89967e91ef0f726422fd32 + md5: b6a408c64b78ec7b779a3e5c7a902433 + depends: + - typing_extensions 4.12.2 pyha770c72_1 + license: PSF-2.0 + license_family: PSF + size: 10075 + timestamp: 1733188758872 +- kind: conda + name: typing_extensions + version: 4.12.2 + build: pyha770c72_1 + build_number: 1 + subdir: noarch + noarch: python + url: https://conda.anaconda.org/conda-forge/noarch/typing_extensions-4.12.2-pyha770c72_1.conda + sha256: 337be7af5af8b2817f115b3b68870208b30c31d3439bec07bfb2d8f4823e3568 + md5: d17f13df8b65464ca316cbc000a3cb64 + depends: + - python >=3.9 + license: PSF-2.0 + license_family: PSF + size: 39637 + timestamp: 1733188758212 +- kind: conda + name: tzdata + version: 2024b + build: hc8b5060_0 + subdir: noarch + noarch: generic + url: https://conda.anaconda.org/conda-forge/noarch/tzdata-2024b-hc8b5060_0.conda + sha256: 4fde5c3008bf5d2db82f2b50204464314cc3c91c1d953652f7bd01d9e52aefdf + md5: 8ac3367aafb1cc0a068483c580af8015 + license: LicenseRef-Public-Domain + size: 122354 + timestamp: 1728047496079 +- kind: conda + name: urllib3 + version: 2.3.0 build: pyhd8ed1ab_0 subdir: noarch noarch: python - url: https://conda.anaconda.org/conda-forge/noarch/python-dateutil-2.9.0-pyhd8ed1ab_0.conda - sha256: f3ceef02ac164a8d3a080d0d32f8e2ebe10dd29e3a685d240e38b3599e146320 - md5: 2cf4264fffb9e6eff6031c5b6884d61c + url: https://conda.anaconda.org/conda-forge/noarch/urllib3-2.3.0-pyhd8ed1ab_0.conda + sha256: 114919ffa80c328127dab9c8e7a38f9d563c617691fb81fccb11c1e86763727e + md5: 32674f8dbfb7b26410ed580dd3c10a29 depends: - - python >=3.7 - - six >=1.5 - license: Apache-2.0 - license_family: APACHE - size: 222742 - timestamp: 1709299922152 + - brotli-python >=1.0.9 + - h2 >=4,<5 + - pysocks >=1.5.6,<2.0,!=1.5.7 + - python >=3.9 + - zstandard >=0.18.0 + license: MIT + license_family: MIT + size: 100102 + timestamp: 1734859520452 - kind: conda - name: python_abi - version: '3.12' - build: 5_cp312 - build_number: 5 - subdir: osx-arm64 - url: https://conda.anaconda.org/conda-forge/osx-arm64/python_abi-3.12-5_cp312.conda - sha256: 49d624e4b809c799d2bf257b22c23cf3fc4460f5570d9a58e7ad86350aeaa1f4 - md5: b76f9b1c862128e56ac7aa8cd2333de9 - constrains: - - python 3.12.* *_cpython + name: uvicorn + version: 0.34.0 + build: pyh31011fe_0 + subdir: noarch + noarch: python + url: https://conda.anaconda.org/conda-forge/noarch/uvicorn-0.34.0-pyh31011fe_0.conda + sha256: 55c160b0cf9274e2b98bc0f7fcce548bffa8d788bc86aa02801877457040f6fa + md5: 5d448feee86e4740498ec8f8eb40e052 + depends: + - __unix + - click >=7.0 + - h11 >=0.8 + - python >=3.9 + - typing_extensions >=4.0 license: BSD-3-Clause license_family: BSD - size: 6278 - timestamp: 1723823099686 + size: 48643 + timestamp: 1734293057914 - kind: conda - name: pyzmq - version: 26.2.0 - build: py312hc6335d2_2 - build_number: 2 - subdir: osx-arm64 - url: https://conda.anaconda.org/conda-forge/osx-arm64/pyzmq-26.2.0-py312hc6335d2_2.conda - sha256: 8d46c0f1af50989f308b9da68e6123bc3560f3a3a741b4e7cb8867c603b5a9f1 - md5: ca61d76f24d66c2938af62e882c9a02d + name: uvicorn-standard + version: 0.34.0 + build: h31011fe_0 + subdir: noarch + noarch: generic + url: https://conda.anaconda.org/conda-forge/noarch/uvicorn-standard-0.34.0-h31011fe_0.conda + sha256: 87e1531e175e75122f9f37608eb953af4c977465ab0ae11283cc01fef954e4ec + md5: 32a94143a7f65d76d2d5da37dcb4ed79 depends: - - __osx >=11.0 - - libcxx >=17 - - libsodium >=1.0.20,<1.0.21.0a0 - - python >=3.12,<3.13.0a0 - - python >=3.12,<3.13.0a0 *_cpython - - python_abi 3.12.* *_cp312 - - zeromq >=4.3.5,<4.4.0a0 + - __unix + - httptools >=0.6.3 + - python-dotenv >=0.13 + - pyyaml >=5.1 + - uvicorn 0.34.0 pyh31011fe_0 + - uvloop >=0.14.0,!=0.15.0,!=0.15.1 + - watchfiles >=0.13 + - websockets >=10.4 license: BSD-3-Clause license_family: BSD - size: 359594 - timestamp: 1725449428595 + size: 7203 + timestamp: 1734293058849 - kind: conda - name: readline - version: '8.2' - build: h92ec313_1 + name: uvloop + version: 0.21.0 + build: py312h0bf5046_1 build_number: 1 subdir: osx-arm64 - url: https://conda.anaconda.org/conda-forge/osx-arm64/readline-8.2-h92ec313_1.conda - sha256: a1dfa679ac3f6007362386576a704ad2d0d7a02e98f5d0b115f207a2da63e884 - md5: 8cbb776a2f641b943d413b3e19df71f4 + url: https://conda.anaconda.org/conda-forge/osx-arm64/uvloop-0.21.0-py312h0bf5046_1.conda + sha256: b1efa77aa4871d7bb09c8dd297fa9bd9070ba7f0f95f2d12ae9cdd31ce8b6b22 + md5: 4f5110253ba80ebf27e55c4ab333880a depends: - - ncurses >=6.3,<7.0a0 - license: GPL-3.0-only - license_family: GPL - size: 250351 - timestamp: 1679532511311 + - __osx >=11.0 + - libuv >=1.49.2,<2.0a0 + - python >=3.12,<3.13.0a0 + - python >=3.12,<3.13.0a0 *_cpython + - python_abi 3.12.* *_cp312 + license: MIT OR Apache-2.0 + size: 544097 + timestamp: 1730214653726 - kind: conda - name: six - version: 1.16.0 - build: pyh6c4a22f_0 - subdir: noarch - noarch: python - url: https://conda.anaconda.org/conda-forge/noarch/six-1.16.0-pyh6c4a22f_0.tar.bz2 - sha256: a85c38227b446f42c5b90d9b642f2c0567880c15d72492d8da074a59c8f91dd6 - md5: e5f25f8dbc060e9a8d912e432202afc2 + name: watchfiles + version: 1.0.3 + build: py312hcd83bfe_0 + subdir: osx-arm64 + url: https://conda.anaconda.org/conda-forge/osx-arm64/watchfiles-1.0.3-py312hcd83bfe_0.conda + sha256: b64b78a7d6384bf72a878256802c783c692fe641ab4b806fd7e9f45e18a5e3b4 + md5: 13b89e1aa72aa773806b1f59ec018b67 depends: - - python + - __osx >=11.0 + - anyio >=3.0.0 + - python >=3.12,<3.13.0a0 + - python >=3.12,<3.13.0a0 *_cpython + - python_abi 3.12.* *_cp312 + constrains: + - __osx >=11.0 license: MIT license_family: MIT - size: 14259 - timestamp: 1620240338595 + size: 363162 + timestamp: 1733999215646 - kind: conda - name: tk - version: 8.6.13 - build: h5083fa2_1 - build_number: 1 + name: websockets + version: '14.1' + build: py312hea69d52_0 subdir: osx-arm64 - url: https://conda.anaconda.org/conda-forge/osx-arm64/tk-8.6.13-h5083fa2_1.conda - sha256: 72457ad031b4c048e5891f3f6cb27a53cb479db68a52d965f796910e71a403a8 - md5: b50a57ba89c32b62428b71a875291c9b + url: https://conda.anaconda.org/conda-forge/osx-arm64/websockets-14.1-py312hea69d52_0.conda + sha256: 98fb04a1a0f53dc604378f94b5795d0b8e462fee01bf0a887cb34d0efdf5d21f + md5: 89b79a9baa7db46ce21f5738a5a3dfda depends: - - libzlib >=1.2.13,<2.0.0a0 - license: TCL + - __osx >=11.0 + - python >=3.12,<3.13.0a0 + - python >=3.12,<3.13.0a0 *_cpython + - python_abi 3.12.* *_cp312 + license: BSD-3-Clause license_family: BSD - size: 3145523 - timestamp: 1699202432999 + size: 243131 + timestamp: 1731498944076 - kind: conda - name: tornado - version: 6.4.1 - build: py312h024a12e_1 - build_number: 1 + name: wrapt + version: 1.17.0 + build: py312hea69d52_0 subdir: osx-arm64 - url: https://conda.anaconda.org/conda-forge/osx-arm64/tornado-6.4.1-py312h024a12e_1.conda - sha256: 5eefede1d8a2f55892bc582dbcb574b1806f19bc1e3939ce56b79721b9406db7 - md5: 967bc97bb9e258993289546479af971f + url: https://conda.anaconda.org/conda-forge/osx-arm64/wrapt-1.17.0-py312hea69d52_0.conda + sha256: 0fb35c3d1642f9f47db87bdb33148f88ef19a3af1eb0ee99b5491551c57269c7 + md5: 73414acdb779a8694a14527865b4357a depends: - __osx >=11.0 - python >=3.12,<3.13.0a0 - python >=3.12,<3.13.0a0 *_cpython - python_abi 3.12.* *_cp312 - license: Apache-2.0 - license_family: Apache - size: 841722 - timestamp: 1724956439106 + license: BSD-2-Clause + license_family: BSD + size: 61043 + timestamp: 1732523852129 - kind: conda - name: traitlets - version: 5.14.3 - build: pyhd8ed1ab_0 - subdir: noarch - noarch: python - url: https://conda.anaconda.org/conda-forge/noarch/traitlets-5.14.3-pyhd8ed1ab_0.conda - sha256: 8a64fa0f19022828513667c2c7176cfd125001f3f4b9bc00d33732e627dd2592 - md5: 3df84416a021220d8b5700c613af2dc5 + name: xorg-libxau + version: 1.0.12 + build: h5505292_0 + subdir: osx-arm64 + url: https://conda.anaconda.org/conda-forge/osx-arm64/xorg-libxau-1.0.12-h5505292_0.conda + sha256: f33e6f013fc36ebc200f09ddead83468544cb5c353a3b50499b07b8c34e28a8d + md5: 50901e0764b7701d8ed7343496f4f301 depends: - - python >=3.8 - license: BSD-3-Clause + - __osx >=11.0 + license: MIT + license_family: MIT + size: 13593 + timestamp: 1734229104321 +- kind: conda + name: xorg-libxdmcp + version: 1.1.5 + build: hd74edd7_0 + subdir: osx-arm64 + url: https://conda.anaconda.org/conda-forge/osx-arm64/xorg-libxdmcp-1.1.5-hd74edd7_0.conda + sha256: 9939a166d780700d81023546759102b33fdc2c5f11ef09f5f66c77210fd334c8 + md5: 77c447f48cab5d3a15ac224edb86a968 + depends: + - __osx >=11.0 + license: MIT + license_family: MIT + size: 18487 + timestamp: 1727795205022 +- kind: conda + name: xxhash + version: 0.8.2 + build: hb547adb_0 + subdir: osx-arm64 + url: https://conda.anaconda.org/conda-forge/osx-arm64/xxhash-0.8.2-hb547adb_0.conda + sha256: a70f59f7221ee72c45b39a6b36a33eb9c717ba01921cce1a3c361a4676979a2e + md5: 144cd3b88706507f332f5eb5fb83a33b + license: BSD-2-Clause license_family: BSD - size: 110187 - timestamp: 1713535244513 + size: 97593 + timestamp: 1689951969732 - kind: conda - name: tzdata - version: 2024a - build: h8827d51_1 - build_number: 1 - subdir: noarch - noarch: generic - url: https://conda.anaconda.org/conda-forge/noarch/tzdata-2024a-h8827d51_1.conda - sha256: 7d21c95f61319dba9209ca17d1935e6128af4235a67ee4e57a00908a1450081e - md5: 8bfdead4e0fff0383ae4c9c50d0531bd - license: LicenseRef-Public-Domain - size: 124164 - timestamp: 1724736371498 + name: yaml + version: 0.2.5 + build: h3422bc3_2 + build_number: 2 + subdir: osx-arm64 + url: https://conda.anaconda.org/conda-forge/osx-arm64/yaml-0.2.5-h3422bc3_2.tar.bz2 + sha256: 93181a04ba8cfecfdfb162fc958436d868cc37db504c58078eab4c1a3e57fbb7 + md5: 4bb3f014845110883a3c5ee811fd84b4 + license: MIT + license_family: MIT + size: 88016 + timestamp: 1641347076660 - kind: conda - name: xz - version: 5.2.6 - build: h57fd34a_0 + name: yarl + version: 1.18.3 + build: py312hea69d52_0 subdir: osx-arm64 - url: https://conda.anaconda.org/conda-forge/osx-arm64/xz-5.2.6-h57fd34a_0.tar.bz2 - sha256: 59d78af0c3e071021cfe82dc40134c19dab8cdf804324b62940f5c8cd71803ec - md5: 39c6b54e94014701dd157f4f576ed211 - license: LGPL-2.1 and GPL-2.0 - size: 235693 - timestamp: 1660346961024 + url: https://conda.anaconda.org/conda-forge/osx-arm64/yarl-1.18.3-py312hea69d52_0.conda + sha256: 69c7863809e11bc90c0d935c16e7f151dcc925add08b3894f06059263a8cb9ba + md5: f32f9b16361866a62d6e061fcd7eb400 + depends: + - __osx >=11.0 + - idna >=2.0 + - multidict >=4.0 + - propcache >=0.2.1 + - python >=3.12,<3.13.0a0 + - python >=3.12,<3.13.0a0 *_cpython + - python_abi 3.12.* *_cp312 + license: Apache-2.0 + license_family: Apache + size: 141556 + timestamp: 1733429104990 - kind: conda name: zeromq version: 4.3.5 - build: h64debc3_5 - build_number: 5 + build: hc1bb282_7 + build_number: 7 subdir: osx-arm64 - url: https://conda.anaconda.org/conda-forge/osx-arm64/zeromq-4.3.5-h64debc3_5.conda - sha256: b4ba544a04129472651a5df3b8906ed68e7f43bf23e724fd0e368218083c920c - md5: c29dbe9343a0b55b027fa645644c59d9 + url: https://conda.anaconda.org/conda-forge/osx-arm64/zeromq-4.3.5-hc1bb282_7.conda + sha256: 9e585569fe2e7d3bea71972cd4b9f06b1a7ab8fa7c5139f92a31cbceecf25a8a + md5: f7e6b65943cb73bce0143737fded08f1 depends: - __osx >=11.0 - krb5 >=1.21.3,<1.22.0a0 - - libcxx >=17 + - libcxx >=18 - libsodium >=1.0.20,<1.0.21.0a0 license: MPL-2.0 license_family: MOZILLA - size: 296355 - timestamp: 1725430145243 + size: 281565 + timestamp: 1731585108039 - kind: conda name: zipp - version: 3.20.2 - build: pyhd8ed1ab_0 + version: 3.21.0 + build: pyhd8ed1ab_1 + build_number: 1 subdir: noarch noarch: python - url: https://conda.anaconda.org/conda-forge/noarch/zipp-3.20.2-pyhd8ed1ab_0.conda - sha256: 1e84fcfa41e0afdd87ff41e6fbb719c96a0e098c1f79be342293ab0bd8dea322 - md5: 4daaed111c05672ae669f7036ee5bba3 + url: https://conda.anaconda.org/conda-forge/noarch/zipp-3.21.0-pyhd8ed1ab_1.conda + sha256: 567c04f124525c97a096b65769834b7acb047db24b15a56888a322bf3966c3e1 + md5: 0c3cc595284c5e8f0f9900a9b228a332 depends: - - python >=3.8 + - python >=3.9 license: MIT license_family: MIT - size: 21409 - timestamp: 1726248679175 + size: 21809 + timestamp: 1732827613585 +- kind: conda + name: zstandard + version: 0.23.0 + build: py312h15fbf35_1 + build_number: 1 + subdir: osx-arm64 + url: https://conda.anaconda.org/conda-forge/osx-arm64/zstandard-0.23.0-py312h15fbf35_1.conda + sha256: d00ca25c1e28fd31199b26a94f8c96574475704a825d244d7a6351ad3745eeeb + md5: a4cde595509a7ad9c13b1a3809bcfe51 + depends: + - __osx >=11.0 + - cffi >=1.11 + - python >=3.12,<3.13.0a0 + - python >=3.12,<3.13.0a0 *_cpython + - python_abi 3.12.* *_cp312 + - zstd >=1.5.6,<1.5.7.0a0 + - zstd >=1.5.6,<1.6.0a0 + license: BSD-3-Clause + license_family: BSD + size: 330788 + timestamp: 1725305806565 +- kind: conda + name: zstd + version: 1.5.6 + build: hb46c0d2_0 + subdir: osx-arm64 + url: https://conda.anaconda.org/conda-forge/osx-arm64/zstd-1.5.6-hb46c0d2_0.conda + sha256: 2d4fd1ff7ee79cd954ca8e81abf11d9d49954dd1fef80f27289e2402ae9c2e09 + md5: d96942c06c3e84bfcc5efb038724a7fd + depends: + - __osx >=11.0 + - libzlib >=1.2.13,<2.0.0a0 + license: BSD-3-Clause + license_family: BSD + size: 405089 + timestamp: 1714723101397 diff --git a/main.mojo b/main.mojo new file mode 100644 index 0000000..4b252d9 --- /dev/null +++ b/main.mojo @@ -0,0 +1,152 @@ +from src.rustls import * +from src.libc import * + +fn main(): + var cert_path = to_char_ptr("/etc/ssl/cert.pem") + + var config = RustlsClientConfig() + + var root_cert_store_builder = new_root_cert_store_builder() + var result = load_roots_from_file(root_cert_store_builder, cert_path, False) + + print("Result: ", result) + # const char *hostname = argv[1]; + # const char *port = argv[2]; + # const char *path = argv[3]; + + # /* Set this global variable for logging purposes. */ + # programname = "client"; + + # const struct rustls_crypto_provider *custom_provider = NULL; + # struct rustls_client_config_builder *config_builder = NULL; + # struct rustls_root_cert_store_builder *server_cert_root_store_builder = NULL; + # const struct rustls_root_cert_store *server_cert_root_store = NULL; + # const struct rustls_client_config *client_config = NULL; + # struct rustls_web_pki_server_cert_verifier_builder + # *server_cert_verifier_builder = NULL; + # struct rustls_server_cert_verifier *server_cert_verifier = NULL; + # struct rustls_slice_bytes alpn_http11; + # const struct rustls_certified_key *certified_key = NULL; + + # alpn_http11.data = (unsigned char *)"http/1.1"; + # alpn_http11.len = 8; + + # #ifdef _WIN32 + # WSADATA wsa; + # WSAStartup(MAKEWORD(1, 1), &wsa); + # setmode(STDOUT_FILENO, O_BINARY); + # #endif + + # const char *custom_ciphersuite_name = getenv("RUSTLS_CIPHERSUITE"); + # if(custom_ciphersuite_name != NULL) { + # custom_provider = + # default_provider_with_custom_ciphersuite(custom_ciphersuite_name); + # if(custom_provider == NULL) { + # goto cleanup; + # } + # printf("customized to use ciphersuite: %s\n", custom_ciphersuite_name); + + # result = rustls_client_config_builder_new_custom(custom_provider, + # default_tls_versions, + # default_tls_versions_len, + # &config_builder); + # if(result != RUSTLS_RESULT_OK) { + # print_error("creating client config builder", result); + # goto cleanup; + # } + # } + # else { + # config_builder = rustls_client_config_builder_new(); + # } + + # if(getenv("RUSTLS_PLATFORM_VERIFIER")) { + # result = rustls_platform_server_cert_verifier(&server_cert_verifier); + # if(result != RUSTLS_RESULT_OK) { + # fprintf(stderr, "client: failed to construct platform verifier\n"); + # goto cleanup; + # } + # rustls_client_config_builder_set_server_verifier(config_builder, + # server_cert_verifier); + # } + # else if(getenv("CA_FILE")) { + # server_cert_root_store_builder = rustls_root_cert_store_builder_new(); + # result = rustls_root_cert_store_builder_load_roots_from_file( + # server_cert_root_store_builder, getenv("CA_FILE"), true); + # if(result != RUSTLS_RESULT_OK) { + # print_error("loading trusted certificates", result); + # goto cleanup; + # } + # result = rustls_root_cert_store_builder_build( + # server_cert_root_store_builder, &server_cert_root_store); + # if(result != RUSTLS_RESULT_OK) { + # goto cleanup; + # } + # server_cert_verifier_builder = + # rustls_web_pki_server_cert_verifier_builder_new(server_cert_root_store); + + # result = rustls_web_pki_server_cert_verifier_builder_build( + # server_cert_verifier_builder, &server_cert_verifier); + # if(result != RUSTLS_RESULT_OK) { + # goto cleanup; + # } + # rustls_client_config_builder_set_server_verifier(config_builder, + # server_cert_verifier); + # } + # else if(getenv("NO_CHECK_CERTIFICATE")) { + # rustls_client_config_builder_dangerous_set_certificate_verifier( + # config_builder, verify); + # } + # else { + # fprintf(stderr, + # "client: must set either RUSTLS_PLATFORM_VERIFIER or CA_FILE or " + # "NO_CHECK_CERTIFICATE env var\n"); + # goto cleanup; + # } + + # char *auth_cert = getenv("AUTH_CERT"); + # char *auth_key = getenv("AUTH_KEY"); + # if((auth_cert && !auth_key) || (!auth_cert && auth_key)) { + # fprintf( + # stderr, + # "client: must set both AUTH_CERT and AUTH_KEY env vars, or neither\n"); + # goto cleanup; + # } + # else if(auth_cert && auth_key) { + # certified_key = load_cert_and_key(auth_cert, auth_key); + # if(certified_key == NULL) { + # goto cleanup; + # } + # rustls_client_config_builder_set_certified_key( + # config_builder, &certified_key, 1); + # } + + # rustls_client_config_builder_set_alpn_protocols( + # config_builder, &alpn_http11, 1); + + # result = rustls_client_config_builder_build(config_builder, &client_config); + # if(result != RUSTLS_RESULT_OK) { + # print_error("building client config", result); + # goto cleanup; + # } + + # int i; + # for(i = 0; i < 3; i++) { + # result = do_request(client_config, hostname, port, path); + # if(result != 0) { + # goto cleanup; + # } + # } + + # // Success! + # ret = 0; + + # cleanup: + # rustls_root_cert_store_builder_free(server_cert_root_store_builder); + # rustls_root_cert_store_free(server_cert_root_store); + # rustls_web_pki_server_cert_verifier_builder_free( + # server_cert_verifier_builder); + # rustls_server_cert_verifier_free(server_cert_verifier); + # rustls_certified_key_free(certified_key); + # rustls_client_config_free(client_config); + # rustls_crypto_provider_free(custom_provider); + diff --git a/mojoproject.toml b/mojoproject.toml index b1fccdc..97c2a27 100644 --- a/mojoproject.toml +++ b/mojoproject.toml @@ -1,10 +1,14 @@ [project] authors = ["Mikhail Tavarez "] -channels = ["conda-forge", "https://conda.modular.com/max", "file:////Users/mikhailtavarez/.rattler/output"] +channels = [ + "conda-forge", + "https://conda.modular.com/max", + "https://repo.prefix.dev/mojo-community", +] description = "Add a short description here" name = "mojo-rustls" platforms = ["osx-arm64"] -version = "0.1.0" +version = "0.1.1" [tasks] tests = "bash scripts/tests.sh" @@ -14,3 +18,6 @@ publish = { cmd = "bash scripts/publish.sh", env = { PREFIX_API_KEY = "$PREFIX_A [dependencies] max = ">=24.5.0,<25" +# mojo-rustls = ">=0.1.1,<0.2" # self dependency just for local testing +gojo = ">=0.1.9,<0.2" +lightbug_http = "0.1.6" diff --git a/output/bld/rattler-build_mojo-rustls-ffi_1726516062/work/LICENSE b/output/bld/rattler-build_mojo-rustls-ffi_1726516062/work/LICENSE new file mode 100644 index 0000000..e1af563 --- /dev/null +++ b/output/bld/rattler-build_mojo-rustls-ffi_1726516062/work/LICENSE @@ -0,0 +1,21 @@ +MIT License + +Copyright (c) 2024 Mikhail Tavarez + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. diff --git a/output/bld/rattler-build_mojo-rustls-ffi_1726516062/work/build_env.sh b/output/bld/rattler-build_mojo-rustls-ffi_1726516062/work/build_env.sh new file mode 100644 index 0000000..6b282cf --- /dev/null +++ b/output/bld/rattler-build_mojo-rustls-ffi_1726516062/work/build_env.sh @@ -0,0 +1,52 @@ +export CONDA_BUILD_STATE="BUILD" +export PKG_CONFIG_PATH="/Users/lukas/dev/mojo-rustls/output/bld/rattler-build_mojo-rustls-ffi_1726516062/host_env_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_place/lib/pkgconfig" +export CMAKE_GENERATOR="Unix Makefiles" +export PIP_NO_DEPENDENCIES="True" +export MAKE_TERMOUT="1" +export GCC_COLORS="error=01;31:warning=01;35:note=01;36:caret=01;32:locus=01:quote=01" +export PKG_HASH="h60d57d3" +export PREFIX="/Users/lukas/dev/mojo-rustls/output/bld/rattler-build_mojo-rustls-ffi_1726516062/host_env_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_place" +export PKG_NAME="mojo-rustls-ffi" +export CLICOLOR_FORCE="1" +export build_platform="osx-arm64" +export PATH="/Users/lukas/dev/mojo-rustls/.magic/envs/default/bin:/Users/lukas/.modular/bin:/nix/var/nix/profiles/default/bin:/Users/lukas/.modular/pkg/packages.modular.com_nightly_max/bin:/Users/lukas/.bin:/Users/lukas/.cargo/bin:/opt/homebrew/opt/llvm/bin:/Users/lukas/.modular/pkg/packages.modular.com_nightly_mojo/bin:/Users/lukas/.nix-profile/bin:/Users/lukas/.modular/pkg/packages.modular.com_mojo/bin:/opt/homebrew/bin:/usr/local/bin:/System/Cryptexes/App/usr/bin:/usr/bin:/bin:/usr/sbin:/sbin:/var/run/com.apple.security.cryptexd/codex.system/bootstrap/usr/local/bin:/var/run/com.apple.security.cryptexd/codex.system/bootstrap/usr/bin:/var/run/com.apple.security.cryptexd/codex.system/bootstrap/usr/appleinternal/bin:/Library/Apple/usr/bin:/usr/local/MacGPG2/bin:/Applications/Ghostty.app/Contents/MacOS" +export BUILD="arm64-apple-darwin20.0.0" +export CMAKE_COLOR_DIAGNOSTICS="ON" +export PKG_BUILD_STRING="h60d57d3_0" +export CONDA_BUILD="1" +export PKG_VERSION="0.1.0" +export SUBDIR="osx-arm64" +export SOURCE_DATE_EPOCH="1726516062" +export PYTHONNOUSERSITE="1" +export AM_COLOR_TESTS="always" +export LANG="en_US.UTF-8" +export SHLIB_EXT=".dylib" +export HOME="/Users/lukas" +export PIP_CACHE_DIR="/Users/lukas/dev/mojo-rustls/output/bld/rattler-build_mojo-rustls-ffi_1726516062/pip_cache" +export LC_ALL="en_US.UTF-8" +export FORCE_COLOR="1" +export SRC_DIR="/Users/lukas/dev/mojo-rustls/output/bld/rattler-build_mojo-rustls-ffi_1726516062/work" +export NPY_DISTUTILS_APPEND_FLAGS="1" +export BUILD_PREFIX="/Users/lukas/dev/mojo-rustls/output/bld/rattler-build_mojo-rustls-ffi_1726516062/build_env" +export MAKEFLAGS="" +export PIP_NO_BUILD_ISOLATION="False" +export CPU_COUNT="16" +export PIP_IGNORE_INSTALLED="True" +export OSX_ARCH="arm64" +export target_platform="osx-arm64" +export PIP_NO_INDEX="True" +export SSL_CERT_FILE="" +export CONDA_DEFAULT_ENV="/Users/lukas/dev/mojo-rustls/output/bld/rattler-build_mojo-rustls-ffi_1726516062/host_env_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_place" +export RECIPE_DIR="/Users/lukas/dev/mojo-rustls/src" +export MACOSX_DEPLOYMENT_TARGET="11.0" +export PYTHON="/Users/lukas/dev/mojo-rustls/output/bld/rattler-build_mojo-rustls-ffi_1726516062/host_env_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_place/bin/python" +export PKG_BUILDNUM="0" +export CONDA_BUILD_CROSS_COMPILATION="0" +export BUILD_DIR="/Users/lukas/dev/mojo-rustls/output/bld/rattler-build_mojo-rustls-ffi_1726516062" +export ARCH="arm64" + +export PATH="/Users/lukas/dev/mojo-rustls/output/bld/rattler-build_mojo-rustls-ffi_1726516062/host_env_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_place/bin:/Users/lukas/.modular/bin:/nix/var/nix/profiles/default/bin:/Users/lukas/.modular/pkg/packages.modular.com_nightly_max/bin:/Users/lukas/.bin:/Users/lukas/.cargo/bin:/opt/homebrew/opt/llvm/bin:/Users/lukas/.modular/pkg/packages.modular.com_nightly_mojo/bin:/Users/lukas/.nix-profile/bin:/Users/lukas/.modular/pkg/packages.modular.com_mojo/bin:/opt/homebrew/bin:/usr/local/bin:/System/Cryptexes/App/usr/bin:/usr/bin:/bin:/usr/sbin:/sbin:/var/run/com.apple.security.cryptexd/codex.system/bootstrap/usr/local/bin:/var/run/com.apple.security.cryptexd/codex.system/bootstrap/usr/bin:/var/run/com.apple.security.cryptexd/codex.system/bootstrap/usr/appleinternal/bin:/Library/Apple/usr/bin:/usr/local/MacGPG2/bin:/Applications/Ghostty.app/Contents/MacOS" +export CONDA_PREFIX="/Users/lukas/dev/mojo-rustls/output/bld/rattler-build_mojo-rustls-ffi_1726516062/host_env_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_place" + +export PATH="/Users/lukas/dev/mojo-rustls/output/bld/rattler-build_mojo-rustls-ffi_1726516062/build_env/bin:/Users/lukas/dev/mojo-rustls/output/bld/rattler-build_mojo-rustls-ffi_1726516062/host_env_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_place/bin:/Users/lukas/.modular/bin:/nix/var/nix/profiles/default/bin:/Users/lukas/.modular/pkg/packages.modular.com_nightly_max/bin:/Users/lukas/.bin:/Users/lukas/.cargo/bin:/opt/homebrew/opt/llvm/bin:/Users/lukas/.modular/pkg/packages.modular.com_nightly_mojo/bin:/Users/lukas/.nix-profile/bin:/Users/lukas/.modular/pkg/packages.modular.com_mojo/bin:/opt/homebrew/bin:/usr/local/bin:/System/Cryptexes/App/usr/bin:/usr/bin:/bin:/usr/sbin:/sbin:/var/run/com.apple.security.cryptexd/codex.system/bootstrap/usr/local/bin:/var/run/com.apple.security.cryptexd/codex.system/bootstrap/usr/bin:/var/run/com.apple.security.cryptexd/codex.system/bootstrap/usr/appleinternal/bin:/Library/Apple/usr/bin:/usr/local/MacGPG2/bin:/Applications/Ghostty.app/Contents/MacOS" +export CONDA_PREFIX="/Users/lukas/dev/mojo-rustls/output/bld/rattler-build_mojo-rustls-ffi_1726516062/build_env" diff --git a/output/bld/rattler-build_mojo-rustls-ffi_1726516062/work/conda_build.sh b/output/bld/rattler-build_mojo-rustls-ffi_1726516062/work/conda_build.sh new file mode 100644 index 0000000..00d24ef --- /dev/null +++ b/output/bld/rattler-build_mojo-rustls-ffi_1726516062/work/conda_build.sh @@ -0,0 +1,13 @@ + +## Start of bash preamble +if [ -z ${CONDA_BUILD+x} ]; then + source /Users/lukas/dev/mojo-rustls/output/bld/rattler-build_mojo-rustls-ffi_1726516062/work/build_env.sh +fi +# enable debug mode for the rest of the script +set -x +## End of preamble + +mkdir -p ${PREFIX}/share/mojo-rustls-ffi +git clone --depth=1 git@github.com:rustls/rustls-ffi.git +cd rustls-ffi && cargo cinstall --library-type=cdylib --destdir=${PREFIX}/share/mojo-rustls-ffi/librustls.dylib +cd .. && rm -R rustls-ffi \ No newline at end of file diff --git a/output/bld/rattler-build_mojo-rustls-ffi_1726516062/work/rustls-ffi b/output/bld/rattler-build_mojo-rustls-ffi_1726516062/work/rustls-ffi new file mode 160000 index 0000000..326bb76 --- /dev/null +++ b/output/bld/rattler-build_mojo-rustls-ffi_1726516062/work/rustls-ffi @@ -0,0 +1 @@ +Subproject commit 326bb76f64db954a92663e87fcf620f2a615ec99 diff --git a/output/bld/rattler-build_mojo-rustls-ffi_1726516100/work/LICENSE b/output/bld/rattler-build_mojo-rustls-ffi_1726516100/work/LICENSE new file mode 100644 index 0000000..e1af563 --- /dev/null +++ b/output/bld/rattler-build_mojo-rustls-ffi_1726516100/work/LICENSE @@ -0,0 +1,21 @@ +MIT License + +Copyright (c) 2024 Mikhail Tavarez + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. diff --git a/output/bld/rattler-build_mojo-rustls-ffi_1726516100/work/build_env.sh b/output/bld/rattler-build_mojo-rustls-ffi_1726516100/work/build_env.sh new file mode 100644 index 0000000..cb5b827 --- /dev/null +++ b/output/bld/rattler-build_mojo-rustls-ffi_1726516100/work/build_env.sh @@ -0,0 +1,52 @@ +export SUBDIR="osx-arm64" +export BUILD_PREFIX="/Users/lukas/dev/mojo-rustls/output/bld/rattler-build_mojo-rustls-ffi_1726516100/build_env" +export FORCE_COLOR="1" +export PKG_BUILD_STRING="h60d57d3_0" +export BUILD_DIR="/Users/lukas/dev/mojo-rustls/output/bld/rattler-build_mojo-rustls-ffi_1726516100" +export SSL_CERT_FILE="" +export SOURCE_DATE_EPOCH="1726516100" +export MAKE_TERMOUT="1" +export PIP_NO_BUILD_ISOLATION="False" +export PKG_NAME="mojo-rustls-ffi" +export PKG_HASH="h60d57d3" +export CMAKE_GENERATOR="Unix Makefiles" +export HOME="/Users/lukas" +export MACOSX_DEPLOYMENT_TARGET="11.0" +export CMAKE_COLOR_DIAGNOSTICS="ON" +export PKG_BUILDNUM="0" +export LC_ALL="en_US.UTF-8" +export LANG="en_US.UTF-8" +export SRC_DIR="/Users/lukas/dev/mojo-rustls/output/bld/rattler-build_mojo-rustls-ffi_1726516100/work" +export CONDA_DEFAULT_ENV="/Users/lukas/dev/mojo-rustls/output/bld/rattler-build_mojo-rustls-ffi_1726516100/host_env_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_place" +export PATH="/Users/lukas/dev/mojo-rustls/.magic/envs/default/bin:/Users/lukas/.modular/bin:/nix/var/nix/profiles/default/bin:/Users/lukas/.modular/pkg/packages.modular.com_nightly_max/bin:/Users/lukas/.bin:/Users/lukas/.cargo/bin:/opt/homebrew/opt/llvm/bin:/Users/lukas/.modular/pkg/packages.modular.com_nightly_mojo/bin:/Users/lukas/.nix-profile/bin:/Users/lukas/.modular/pkg/packages.modular.com_mojo/bin:/opt/homebrew/bin:/usr/local/bin:/System/Cryptexes/App/usr/bin:/usr/bin:/bin:/usr/sbin:/sbin:/var/run/com.apple.security.cryptexd/codex.system/bootstrap/usr/local/bin:/var/run/com.apple.security.cryptexd/codex.system/bootstrap/usr/bin:/var/run/com.apple.security.cryptexd/codex.system/bootstrap/usr/appleinternal/bin:/Library/Apple/usr/bin:/usr/local/MacGPG2/bin:/Applications/Ghostty.app/Contents/MacOS" +export RECIPE_DIR="/Users/lukas/dev/mojo-rustls/src" +export CONDA_BUILD_STATE="BUILD" +export PIP_IGNORE_INSTALLED="True" +export CONDA_BUILD="1" +export GCC_COLORS="error=01;31:warning=01;35:note=01;36:caret=01;32:locus=01:quote=01" +export CONDA_BUILD_CROSS_COMPILATION="0" +export build_platform="osx-arm64" +export PKG_VERSION="0.1.0" +export PIP_NO_INDEX="True" +export NPY_DISTUTILS_APPEND_FLAGS="1" +export BUILD="arm64-apple-darwin20.0.0" +export SHLIB_EXT=".dylib" +export PYTHONNOUSERSITE="1" +export PREFIX="/Users/lukas/dev/mojo-rustls/output/bld/rattler-build_mojo-rustls-ffi_1726516100/host_env_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_place" +export CLICOLOR_FORCE="1" +export PKG_CONFIG_PATH="/Users/lukas/dev/mojo-rustls/output/bld/rattler-build_mojo-rustls-ffi_1726516100/host_env_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_place/lib/pkgconfig" +export OSX_ARCH="arm64" +export ARCH="arm64" +export PYTHON="/Users/lukas/dev/mojo-rustls/output/bld/rattler-build_mojo-rustls-ffi_1726516100/host_env_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_place/bin/python" +export PIP_NO_DEPENDENCIES="True" +export CPU_COUNT="16" +export AM_COLOR_TESTS="always" +export MAKEFLAGS="" +export PIP_CACHE_DIR="/Users/lukas/dev/mojo-rustls/output/bld/rattler-build_mojo-rustls-ffi_1726516100/pip_cache" +export target_platform="osx-arm64" + +export PATH="/Users/lukas/dev/mojo-rustls/output/bld/rattler-build_mojo-rustls-ffi_1726516100/host_env_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_place/bin:/Users/lukas/.modular/bin:/nix/var/nix/profiles/default/bin:/Users/lukas/.modular/pkg/packages.modular.com_nightly_max/bin:/Users/lukas/.bin:/Users/lukas/.cargo/bin:/opt/homebrew/opt/llvm/bin:/Users/lukas/.modular/pkg/packages.modular.com_nightly_mojo/bin:/Users/lukas/.nix-profile/bin:/Users/lukas/.modular/pkg/packages.modular.com_mojo/bin:/opt/homebrew/bin:/usr/local/bin:/System/Cryptexes/App/usr/bin:/usr/bin:/bin:/usr/sbin:/sbin:/var/run/com.apple.security.cryptexd/codex.system/bootstrap/usr/local/bin:/var/run/com.apple.security.cryptexd/codex.system/bootstrap/usr/bin:/var/run/com.apple.security.cryptexd/codex.system/bootstrap/usr/appleinternal/bin:/Library/Apple/usr/bin:/usr/local/MacGPG2/bin:/Applications/Ghostty.app/Contents/MacOS" +export CONDA_PREFIX="/Users/lukas/dev/mojo-rustls/output/bld/rattler-build_mojo-rustls-ffi_1726516100/host_env_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_place" + +export PATH="/Users/lukas/dev/mojo-rustls/output/bld/rattler-build_mojo-rustls-ffi_1726516100/build_env/bin:/Users/lukas/dev/mojo-rustls/output/bld/rattler-build_mojo-rustls-ffi_1726516100/host_env_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_place/bin:/Users/lukas/.modular/bin:/nix/var/nix/profiles/default/bin:/Users/lukas/.modular/pkg/packages.modular.com_nightly_max/bin:/Users/lukas/.bin:/Users/lukas/.cargo/bin:/opt/homebrew/opt/llvm/bin:/Users/lukas/.modular/pkg/packages.modular.com_nightly_mojo/bin:/Users/lukas/.nix-profile/bin:/Users/lukas/.modular/pkg/packages.modular.com_mojo/bin:/opt/homebrew/bin:/usr/local/bin:/System/Cryptexes/App/usr/bin:/usr/bin:/bin:/usr/sbin:/sbin:/var/run/com.apple.security.cryptexd/codex.system/bootstrap/usr/local/bin:/var/run/com.apple.security.cryptexd/codex.system/bootstrap/usr/bin:/var/run/com.apple.security.cryptexd/codex.system/bootstrap/usr/appleinternal/bin:/Library/Apple/usr/bin:/usr/local/MacGPG2/bin:/Applications/Ghostty.app/Contents/MacOS" +export CONDA_PREFIX="/Users/lukas/dev/mojo-rustls/output/bld/rattler-build_mojo-rustls-ffi_1726516100/build_env" diff --git a/output/bld/rattler-build_mojo-rustls-ffi_1726516100/work/conda_build.sh b/output/bld/rattler-build_mojo-rustls-ffi_1726516100/work/conda_build.sh new file mode 100644 index 0000000..d07e190 --- /dev/null +++ b/output/bld/rattler-build_mojo-rustls-ffi_1726516100/work/conda_build.sh @@ -0,0 +1,13 @@ + +## Start of bash preamble +if [ -z ${CONDA_BUILD+x} ]; then + source /Users/lukas/dev/mojo-rustls/output/bld/rattler-build_mojo-rustls-ffi_1726516100/work/build_env.sh +fi +# enable debug mode for the rest of the script +set -x +## End of preamble + +mkdir -p ${PREFIX}/share/mojo-rustls-ffi +git clone --depth=1 git@github.com:rustls/rustls-ffi.git +cd rustls-ffi && cargo install --library-type=cdylib --destdir=${PREFIX}/share/mojo-rustls-ffi/librustls.dylib +cd .. && rm -R rustls-ffi \ No newline at end of file diff --git a/output/bld/rattler-build_mojo-rustls-ffi_1726516100/work/rustls-ffi b/output/bld/rattler-build_mojo-rustls-ffi_1726516100/work/rustls-ffi new file mode 160000 index 0000000..326bb76 --- /dev/null +++ b/output/bld/rattler-build_mojo-rustls-ffi_1726516100/work/rustls-ffi @@ -0,0 +1 @@ +Subproject commit 326bb76f64db954a92663e87fcf620f2a615ec99 diff --git a/output/bld/rattler-build_mojo-rustls-ffi_1726516168/work/LICENSE b/output/bld/rattler-build_mojo-rustls-ffi_1726516168/work/LICENSE new file mode 100644 index 0000000..e1af563 --- /dev/null +++ b/output/bld/rattler-build_mojo-rustls-ffi_1726516168/work/LICENSE @@ -0,0 +1,21 @@ +MIT License + +Copyright (c) 2024 Mikhail Tavarez + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. diff --git a/output/bld/rattler-build_mojo-rustls-ffi_1726516168/work/build_env.sh b/output/bld/rattler-build_mojo-rustls-ffi_1726516168/work/build_env.sh new file mode 100644 index 0000000..767ee75 --- /dev/null +++ b/output/bld/rattler-build_mojo-rustls-ffi_1726516168/work/build_env.sh @@ -0,0 +1,53 @@ +export BUILD="arm64-apple-darwin20.0.0" +export OSX_ARCH="arm64" +export PKG_CONFIG_PATH="/Users/lukas/dev/mojo-rustls/output/bld/rattler-build_mojo-rustls-ffi_1726516168/host_env_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_place/lib/pkgconfig" +export MAKEFLAGS="" +export PIP_IGNORE_INSTALLED="True" +export PIP_NO_INDEX="True" +export build_platform="osx-arm64" +export CONDA_BUILD="1" +export CONDA_BUILD_STATE="BUILD" +export SHLIB_EXT=".dylib" +export PKG_BUILD_STRING="h60d57d3_0" +export BUILD_PREFIX="/Users/lukas/dev/mojo-rustls/output/bld/rattler-build_mojo-rustls-ffi_1726516168/build_env" +export SUBDIR="osx-arm64" +export PYTHON="/Users/lukas/dev/mojo-rustls/output/bld/rattler-build_mojo-rustls-ffi_1726516168/host_env_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_place/bin/python" +export CMAKE_COLOR_DIAGNOSTICS="ON" +export PKG_HASH="h60d57d3" +export CMAKE_GENERATOR="Unix Makefiles" +export PYTHONNOUSERSITE="1" +export RECIPE_DIR="/Users/lukas/dev/mojo-rustls/src" +export AM_COLOR_TESTS="always" +export PKG_VERSION="0.1.0" +export PATH="/Users/lukas/dev/mojo-rustls/.magic/envs/default/bin:/Users/lukas/.modular/bin:/nix/var/nix/profiles/default/bin:/Users/lukas/.modular/pkg/packages.modular.com_nightly_max/bin:/Users/lukas/.bin:/Users/lukas/.cargo/bin:/opt/homebrew/opt/llvm/bin:/Users/lukas/.modular/pkg/packages.modular.com_nightly_mojo/bin:/Users/lukas/.nix-profile/bin:/Users/lukas/.modular/pkg/packages.modular.com_mojo/bin:/opt/homebrew/bin:/usr/local/bin:/System/Cryptexes/App/usr/bin:/usr/bin:/bin:/usr/sbin:/sbin:/var/run/com.apple.security.cryptexd/codex.system/bootstrap/usr/local/bin:/var/run/com.apple.security.cryptexd/codex.system/bootstrap/usr/bin:/var/run/com.apple.security.cryptexd/codex.system/bootstrap/usr/appleinternal/bin:/Library/Apple/usr/bin:/usr/local/MacGPG2/bin:/Applications/Ghostty.app/Contents/MacOS" +export CPU_COUNT="16" +export PIP_NO_DEPENDENCIES="True" +export CLICOLOR_FORCE="1" +export target_platform="osx-arm64" +export SOURCE_DATE_EPOCH="1726516168" +export NPY_DISTUTILS_APPEND_FLAGS="1" +export CONDA_DEFAULT_ENV="/Users/lukas/dev/mojo-rustls/output/bld/rattler-build_mojo-rustls-ffi_1726516168/host_env_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_place" +export LC_ALL="en_US.UTF-8" +export MAKE_TERMOUT="1" +export FORCE_COLOR="1" +export LANG="en_US.UTF-8" +export ARCH="arm64" +export MACOSX_DEPLOYMENT_TARGET="11.0" +export HOME="/Users/lukas" +export PIP_CACHE_DIR="/Users/lukas/dev/mojo-rustls/output/bld/rattler-build_mojo-rustls-ffi_1726516168/pip_cache" +export SRC_DIR="/Users/lukas/dev/mojo-rustls/output/bld/rattler-build_mojo-rustls-ffi_1726516168/work" +export PIP_NO_BUILD_ISOLATION="False" +export CONDA_BUILD_CROSS_COMPILATION="0" +export PREFIX="/Users/lukas/dev/mojo-rustls/output/bld/rattler-build_mojo-rustls-ffi_1726516168/host_env_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_place" +export PKG_BUILDNUM="0" +export BUILD_DIR="/Users/lukas/dev/mojo-rustls/output/bld/rattler-build_mojo-rustls-ffi_1726516168" +export SSL_CERT_FILE="" +export PKG_NAME="mojo-rustls-ffi" +export GCC_COLORS="error=01;31:warning=01;35:note=01;36:caret=01;32:locus=01:quote=01" + +. "/Users/lukas/dev/mojo-rustls/.magic/envs/default/etc/conda/deactivate.d/libglib_deactivate.sh" +export PATH="/Users/lukas/dev/mojo-rustls/output/bld/rattler-build_mojo-rustls-ffi_1726516168/host_env_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_place/bin:/Users/lukas/.modular/bin:/nix/var/nix/profiles/default/bin:/Users/lukas/.modular/pkg/packages.modular.com_nightly_max/bin:/Users/lukas/.bin:/Users/lukas/.cargo/bin:/opt/homebrew/opt/llvm/bin:/Users/lukas/.modular/pkg/packages.modular.com_nightly_mojo/bin:/Users/lukas/.nix-profile/bin:/Users/lukas/.modular/pkg/packages.modular.com_mojo/bin:/opt/homebrew/bin:/usr/local/bin:/System/Cryptexes/App/usr/bin:/usr/bin:/bin:/usr/sbin:/sbin:/var/run/com.apple.security.cryptexd/codex.system/bootstrap/usr/local/bin:/var/run/com.apple.security.cryptexd/codex.system/bootstrap/usr/bin:/var/run/com.apple.security.cryptexd/codex.system/bootstrap/usr/appleinternal/bin:/Library/Apple/usr/bin:/usr/local/MacGPG2/bin:/Applications/Ghostty.app/Contents/MacOS" +export CONDA_PREFIX="/Users/lukas/dev/mojo-rustls/output/bld/rattler-build_mojo-rustls-ffi_1726516168/host_env_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_place" + +export PATH="/Users/lukas/dev/mojo-rustls/output/bld/rattler-build_mojo-rustls-ffi_1726516168/build_env/bin:/Users/lukas/dev/mojo-rustls/output/bld/rattler-build_mojo-rustls-ffi_1726516168/host_env_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_place/bin:/Users/lukas/.modular/bin:/nix/var/nix/profiles/default/bin:/Users/lukas/.modular/pkg/packages.modular.com_nightly_max/bin:/Users/lukas/.bin:/Users/lukas/.cargo/bin:/opt/homebrew/opt/llvm/bin:/Users/lukas/.modular/pkg/packages.modular.com_nightly_mojo/bin:/Users/lukas/.nix-profile/bin:/Users/lukas/.modular/pkg/packages.modular.com_mojo/bin:/opt/homebrew/bin:/usr/local/bin:/System/Cryptexes/App/usr/bin:/usr/bin:/bin:/usr/sbin:/sbin:/var/run/com.apple.security.cryptexd/codex.system/bootstrap/usr/local/bin:/var/run/com.apple.security.cryptexd/codex.system/bootstrap/usr/bin:/var/run/com.apple.security.cryptexd/codex.system/bootstrap/usr/appleinternal/bin:/Library/Apple/usr/bin:/usr/local/MacGPG2/bin:/Applications/Ghostty.app/Contents/MacOS" +export CONDA_PREFIX="/Users/lukas/dev/mojo-rustls/output/bld/rattler-build_mojo-rustls-ffi_1726516168/build_env" diff --git a/output/bld/rattler-build_mojo-rustls-ffi_1726516168/work/conda_build.sh b/output/bld/rattler-build_mojo-rustls-ffi_1726516168/work/conda_build.sh new file mode 100644 index 0000000..b7bef3b --- /dev/null +++ b/output/bld/rattler-build_mojo-rustls-ffi_1726516168/work/conda_build.sh @@ -0,0 +1,13 @@ + +## Start of bash preamble +if [ -z ${CONDA_BUILD+x} ]; then + source /Users/lukas/dev/mojo-rustls/output/bld/rattler-build_mojo-rustls-ffi_1726516168/work/build_env.sh +fi +# enable debug mode for the rest of the script +set -x +## End of preamble + +mkdir -p ${PREFIX}/share/mojo-rustls-ffi +git clone --depth=1 git@github.com:rustls/rustls-ffi.git +cd rustls-ffi && cargo cinstall --library-type=cdylib --destdir=${PREFIX}/share/mojo-rustls-ffi/librustls.dylib +cd .. && rm -R rustls-ffi \ No newline at end of file diff --git a/output/bld/rattler-build_mojo-rustls-ffi_1726516168/work/rustls-ffi b/output/bld/rattler-build_mojo-rustls-ffi_1726516168/work/rustls-ffi new file mode 160000 index 0000000..326bb76 --- /dev/null +++ b/output/bld/rattler-build_mojo-rustls-ffi_1726516168/work/rustls-ffi @@ -0,0 +1 @@ +Subproject commit 326bb76f64db954a92663e87fcf620f2a615ec99 diff --git a/output/bld/rattler-build_mojo-rustls-ffi_1726516232/work/LICENSE b/output/bld/rattler-build_mojo-rustls-ffi_1726516232/work/LICENSE new file mode 100644 index 0000000..e1af563 --- /dev/null +++ b/output/bld/rattler-build_mojo-rustls-ffi_1726516232/work/LICENSE @@ -0,0 +1,21 @@ +MIT License + +Copyright (c) 2024 Mikhail Tavarez + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. diff --git a/output/bld/rattler-build_mojo-rustls-ffi_1726516232/work/build_env.sh b/output/bld/rattler-build_mojo-rustls-ffi_1726516232/work/build_env.sh new file mode 100644 index 0000000..3a7b006 --- /dev/null +++ b/output/bld/rattler-build_mojo-rustls-ffi_1726516232/work/build_env.sh @@ -0,0 +1,53 @@ +export ARCH="arm64" +export PIP_NO_INDEX="True" +export PKG_BUILD_STRING="h60d57d3_0" +export CONDA_DEFAULT_ENV="/Users/lukas/dev/mojo-rustls/output/bld/rattler-build_mojo-rustls-ffi_1726516232/host_env_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_place" +export CONDA_BUILD_CROSS_COMPILATION="0" +export CONDA_BUILD_STATE="BUILD" +export MACOSX_DEPLOYMENT_TARGET="11.0" +export HOME="/Users/lukas" +export build_platform="osx-arm64" +export BUILD_PREFIX="/Users/lukas/dev/mojo-rustls/output/bld/rattler-build_mojo-rustls-ffi_1726516232/build_env" +export CONDA_BUILD="1" +export MAKE_TERMOUT="1" +export RECIPE_DIR="/Users/lukas/dev/mojo-rustls/src" +export PIP_NO_BUILD_ISOLATION="False" +export SRC_DIR="/Users/lukas/dev/mojo-rustls/output/bld/rattler-build_mojo-rustls-ffi_1726516232/work" +export PIP_CACHE_DIR="/Users/lukas/dev/mojo-rustls/output/bld/rattler-build_mojo-rustls-ffi_1726516232/pip_cache" +export BUILD_DIR="/Users/lukas/dev/mojo-rustls/output/bld/rattler-build_mojo-rustls-ffi_1726516232" +export FORCE_COLOR="1" +export CLICOLOR_FORCE="1" +export PKG_VERSION="0.1.0" +export target_platform="osx-arm64" +export PIP_IGNORE_INSTALLED="True" +export AM_COLOR_TESTS="always" +export PREFIX="/Users/lukas/dev/mojo-rustls/output/bld/rattler-build_mojo-rustls-ffi_1726516232/host_env_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_place" +export PKG_BUILDNUM="0" +export PYTHON="/Users/lukas/dev/mojo-rustls/output/bld/rattler-build_mojo-rustls-ffi_1726516232/host_env_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_place/bin/python" +export GCC_COLORS="error=01;31:warning=01;35:note=01;36:caret=01;32:locus=01:quote=01" +export CMAKE_GENERATOR="Unix Makefiles" +export PKG_CONFIG_PATH="/Users/lukas/dev/mojo-rustls/output/bld/rattler-build_mojo-rustls-ffi_1726516232/host_env_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_place/lib/pkgconfig" +export SHLIB_EXT=".dylib" +export CPU_COUNT="16" +export MAKEFLAGS="" +export PYTHONNOUSERSITE="1" +export SUBDIR="osx-arm64" +export SOURCE_DATE_EPOCH="1726516232" +export OSX_ARCH="arm64" +export CMAKE_COLOR_DIAGNOSTICS="ON" +export SSL_CERT_FILE="" +export LANG="en_US.UTF-8" +export NPY_DISTUTILS_APPEND_FLAGS="1" +export LC_ALL="en_US.UTF-8" +export PKG_NAME="mojo-rustls-ffi" +export PIP_NO_DEPENDENCIES="True" +export PKG_HASH="h60d57d3" +export PATH="/Users/lukas/dev/mojo-rustls/.magic/envs/default/bin:/Users/lukas/.modular/bin:/nix/var/nix/profiles/default/bin:/Users/lukas/.modular/pkg/packages.modular.com_nightly_max/bin:/Users/lukas/.bin:/Users/lukas/.cargo/bin:/opt/homebrew/opt/llvm/bin:/Users/lukas/.modular/pkg/packages.modular.com_nightly_mojo/bin:/Users/lukas/.nix-profile/bin:/Users/lukas/.modular/pkg/packages.modular.com_mojo/bin:/opt/homebrew/bin:/usr/local/bin:/System/Cryptexes/App/usr/bin:/usr/bin:/bin:/usr/sbin:/sbin:/var/run/com.apple.security.cryptexd/codex.system/bootstrap/usr/local/bin:/var/run/com.apple.security.cryptexd/codex.system/bootstrap/usr/bin:/var/run/com.apple.security.cryptexd/codex.system/bootstrap/usr/appleinternal/bin:/Library/Apple/usr/bin:/usr/local/MacGPG2/bin:/Applications/Ghostty.app/Contents/MacOS" +export BUILD="arm64-apple-darwin20.0.0" + +. "/Users/lukas/dev/mojo-rustls/.magic/envs/default/etc/conda/deactivate.d/libglib_deactivate.sh" +export PATH="/Users/lukas/dev/mojo-rustls/output/bld/rattler-build_mojo-rustls-ffi_1726516232/host_env_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_place/bin:/Users/lukas/.modular/bin:/nix/var/nix/profiles/default/bin:/Users/lukas/.modular/pkg/packages.modular.com_nightly_max/bin:/Users/lukas/.bin:/Users/lukas/.cargo/bin:/opt/homebrew/opt/llvm/bin:/Users/lukas/.modular/pkg/packages.modular.com_nightly_mojo/bin:/Users/lukas/.nix-profile/bin:/Users/lukas/.modular/pkg/packages.modular.com_mojo/bin:/opt/homebrew/bin:/usr/local/bin:/System/Cryptexes/App/usr/bin:/usr/bin:/bin:/usr/sbin:/sbin:/var/run/com.apple.security.cryptexd/codex.system/bootstrap/usr/local/bin:/var/run/com.apple.security.cryptexd/codex.system/bootstrap/usr/bin:/var/run/com.apple.security.cryptexd/codex.system/bootstrap/usr/appleinternal/bin:/Library/Apple/usr/bin:/usr/local/MacGPG2/bin:/Applications/Ghostty.app/Contents/MacOS" +export CONDA_PREFIX="/Users/lukas/dev/mojo-rustls/output/bld/rattler-build_mojo-rustls-ffi_1726516232/host_env_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_place" + +export PATH="/Users/lukas/dev/mojo-rustls/output/bld/rattler-build_mojo-rustls-ffi_1726516232/build_env/bin:/Users/lukas/dev/mojo-rustls/output/bld/rattler-build_mojo-rustls-ffi_1726516232/host_env_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_place/bin:/Users/lukas/.modular/bin:/nix/var/nix/profiles/default/bin:/Users/lukas/.modular/pkg/packages.modular.com_nightly_max/bin:/Users/lukas/.bin:/Users/lukas/.cargo/bin:/opt/homebrew/opt/llvm/bin:/Users/lukas/.modular/pkg/packages.modular.com_nightly_mojo/bin:/Users/lukas/.nix-profile/bin:/Users/lukas/.modular/pkg/packages.modular.com_mojo/bin:/opt/homebrew/bin:/usr/local/bin:/System/Cryptexes/App/usr/bin:/usr/bin:/bin:/usr/sbin:/sbin:/var/run/com.apple.security.cryptexd/codex.system/bootstrap/usr/local/bin:/var/run/com.apple.security.cryptexd/codex.system/bootstrap/usr/bin:/var/run/com.apple.security.cryptexd/codex.system/bootstrap/usr/appleinternal/bin:/Library/Apple/usr/bin:/usr/local/MacGPG2/bin:/Applications/Ghostty.app/Contents/MacOS" +export CONDA_PREFIX="/Users/lukas/dev/mojo-rustls/output/bld/rattler-build_mojo-rustls-ffi_1726516232/build_env" diff --git a/output/bld/rattler-build_mojo-rustls-ffi_1726516232/work/conda_build.sh b/output/bld/rattler-build_mojo-rustls-ffi_1726516232/work/conda_build.sh new file mode 100644 index 0000000..c3952bb --- /dev/null +++ b/output/bld/rattler-build_mojo-rustls-ffi_1726516232/work/conda_build.sh @@ -0,0 +1,13 @@ + +## Start of bash preamble +if [ -z ${CONDA_BUILD+x} ]; then + source /Users/lukas/dev/mojo-rustls/output/bld/rattler-build_mojo-rustls-ffi_1726516232/work/build_env.sh +fi +# enable debug mode for the rest of the script +set -x +## End of preamble + +mkdir -p ${PREFIX}/share/mojo-rustls-ffi +git clone --depth=1 git@github.com:rustls/rustls-ffi.git +cd rustls-ffi && cargo cinstall --library-type=cdylib --destdir=${PREFIX}/share/mojo-rustls-ffi/librustls.dylib +cd .. && rm -R rustls-ffi \ No newline at end of file diff --git a/output/bld/rattler-build_mojo-rustls-ffi_1726516232/work/rustls-ffi b/output/bld/rattler-build_mojo-rustls-ffi_1726516232/work/rustls-ffi new file mode 160000 index 0000000..326bb76 --- /dev/null +++ b/output/bld/rattler-build_mojo-rustls-ffi_1726516232/work/rustls-ffi @@ -0,0 +1 @@ +Subproject commit 326bb76f64db954a92663e87fcf620f2a615ec99 diff --git a/output/bld/rattler-build_mojo-rustls-ffi_1726516439/work/LICENSE b/output/bld/rattler-build_mojo-rustls-ffi_1726516439/work/LICENSE new file mode 100644 index 0000000..e1af563 --- /dev/null +++ b/output/bld/rattler-build_mojo-rustls-ffi_1726516439/work/LICENSE @@ -0,0 +1,21 @@ +MIT License + +Copyright (c) 2024 Mikhail Tavarez + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. diff --git a/output/bld/rattler-build_mojo-rustls_1726682138/work/LICENSE b/output/bld/rattler-build_mojo-rustls_1726682138/work/LICENSE new file mode 100644 index 0000000..e1af563 --- /dev/null +++ b/output/bld/rattler-build_mojo-rustls_1726682138/work/LICENSE @@ -0,0 +1,21 @@ +MIT License + +Copyright (c) 2024 Mikhail Tavarez + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. diff --git a/output/bld/rattler-build_mojo-rustls_1726682138/work/build_env.sh b/output/bld/rattler-build_mojo-rustls_1726682138/work/build_env.sh new file mode 100644 index 0000000..cffe4b1 --- /dev/null +++ b/output/bld/rattler-build_mojo-rustls_1726682138/work/build_env.sh @@ -0,0 +1,52 @@ +export CONDA_BUILD_STATE="BUILD" +export HOME="/Users/lukas" +export CMAKE_COLOR_DIAGNOSTICS="ON" +export MACOSX_DEPLOYMENT_TARGET="11.0" +export BUILD_PREFIX="/Users/lukas/dev/mojo-rustls/output/bld/rattler-build_mojo-rustls_1726682138/build_env" +export PREFIX="/Users/lukas/dev/mojo-rustls/output/bld/rattler-build_mojo-rustls_1726682138/host_env_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold" +export PATH="/Users/lukas/dev/mojo-rustls/.magic/envs/default/bin:/Users/lukas/.modular/bin:/nix/var/nix/profiles/default/bin:/Users/lukas/.modular/pkg/packages.modular.com_nightly_max/bin:/Users/lukas/.bin:/Users/lukas/.cargo/bin:/opt/homebrew/opt/llvm/bin:/Users/lukas/.modular/pkg/packages.modular.com_nightly_mojo/bin:/Users/lukas/.nix-profile/bin:/Users/lukas/.modular/pkg/packages.modular.com_mojo/bin:/opt/homebrew/bin:/usr/local/bin:/System/Cryptexes/App/usr/bin:/usr/bin:/bin:/usr/sbin:/sbin:/var/run/com.apple.security.cryptexd/codex.system/bootstrap/usr/local/bin:/var/run/com.apple.security.cryptexd/codex.system/bootstrap/usr/bin:/var/run/com.apple.security.cryptexd/codex.system/bootstrap/usr/appleinternal/bin:/Library/Apple/usr/bin:/usr/local/MacGPG2/bin:/Applications/Ghostty.app/Contents/MacOS" +export LC_ALL="en_US.UTF-8" +export CLICOLOR_FORCE="1" +export PKG_NAME="mojo-rustls" +export SUBDIR="osx-arm64" +export PYTHONNOUSERSITE="1" +export AM_COLOR_TESTS="always" +export PIP_IGNORE_INSTALLED="True" +export PKG_VERSION="0.1.1" +export PIP_CACHE_DIR="/Users/lukas/dev/mojo-rustls/output/bld/rattler-build_mojo-rustls_1726682138/pip_cache" +export PYTHON="/Users/lukas/dev/mojo-rustls/output/bld/rattler-build_mojo-rustls_1726682138/host_env_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold/bin/python" +export OSX_ARCH="arm64" +export CONDA_BUILD_CROSS_COMPILATION="0" +export SOURCE_DATE_EPOCH="1726682138" +export ARCH="arm64" +export CONDA_DEFAULT_ENV="/Users/lukas/dev/mojo-rustls/output/bld/rattler-build_mojo-rustls_1726682138/host_env_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold" +export PKG_BUILD_STRING="h60d57d3_0" +export LANG="en_US.UTF-8" +export CONDA_BUILD="1" +export PKG_HASH="h60d57d3" +export build_platform="osx-arm64" +export BUILD_DIR="/Users/lukas/dev/mojo-rustls/output/bld/rattler-build_mojo-rustls_1726682138" +export NPY_DISTUTILS_APPEND_FLAGS="1" +export PKG_BUILDNUM="0" +export SHLIB_EXT=".dylib" +export SSL_CERT_FILE="" +export RECIPE_DIR="/Users/lukas/dev/mojo-rustls/src" +export target_platform="osx-arm64" +export PKG_CONFIG_PATH="/Users/lukas/dev/mojo-rustls/output/bld/rattler-build_mojo-rustls_1726682138/host_env_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold/lib/pkgconfig" +export MAKEFLAGS="" +export GCC_COLORS="error=01;31:warning=01;35:note=01;36:caret=01;32:locus=01:quote=01" +export CPU_COUNT="16" +export PIP_NO_INDEX="True" +export FORCE_COLOR="1" +export BUILD="arm64-apple-darwin20.0.0" +export PIP_NO_DEPENDENCIES="True" +export SRC_DIR="/Users/lukas/dev/mojo-rustls/output/bld/rattler-build_mojo-rustls_1726682138/work" +export PIP_NO_BUILD_ISOLATION="False" +export MAKE_TERMOUT="1" +export CMAKE_GENERATOR="Unix Makefiles" + +export PATH="/Users/lukas/dev/mojo-rustls/output/bld/rattler-build_mojo-rustls_1726682138/host_env_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold/bin:/Users/lukas/.modular/bin:/nix/var/nix/profiles/default/bin:/Users/lukas/.modular/pkg/packages.modular.com_nightly_max/bin:/Users/lukas/.bin:/Users/lukas/.cargo/bin:/opt/homebrew/opt/llvm/bin:/Users/lukas/.modular/pkg/packages.modular.com_nightly_mojo/bin:/Users/lukas/.nix-profile/bin:/Users/lukas/.modular/pkg/packages.modular.com_mojo/bin:/opt/homebrew/bin:/usr/local/bin:/System/Cryptexes/App/usr/bin:/usr/bin:/bin:/usr/sbin:/sbin:/var/run/com.apple.security.cryptexd/codex.system/bootstrap/usr/local/bin:/var/run/com.apple.security.cryptexd/codex.system/bootstrap/usr/bin:/var/run/com.apple.security.cryptexd/codex.system/bootstrap/usr/appleinternal/bin:/Library/Apple/usr/bin:/usr/local/MacGPG2/bin:/Applications/Ghostty.app/Contents/MacOS" +export CONDA_PREFIX="/Users/lukas/dev/mojo-rustls/output/bld/rattler-build_mojo-rustls_1726682138/host_env_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold" + +export PATH="/Users/lukas/dev/mojo-rustls/output/bld/rattler-build_mojo-rustls_1726682138/build_env/bin:/Users/lukas/dev/mojo-rustls/output/bld/rattler-build_mojo-rustls_1726682138/host_env_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold/bin:/Users/lukas/.modular/bin:/nix/var/nix/profiles/default/bin:/Users/lukas/.modular/pkg/packages.modular.com_nightly_max/bin:/Users/lukas/.bin:/Users/lukas/.cargo/bin:/opt/homebrew/opt/llvm/bin:/Users/lukas/.modular/pkg/packages.modular.com_nightly_mojo/bin:/Users/lukas/.nix-profile/bin:/Users/lukas/.modular/pkg/packages.modular.com_mojo/bin:/opt/homebrew/bin:/usr/local/bin:/System/Cryptexes/App/usr/bin:/usr/bin:/bin:/usr/sbin:/sbin:/var/run/com.apple.security.cryptexd/codex.system/bootstrap/usr/local/bin:/var/run/com.apple.security.cryptexd/codex.system/bootstrap/usr/bin:/var/run/com.apple.security.cryptexd/codex.system/bootstrap/usr/appleinternal/bin:/Library/Apple/usr/bin:/usr/local/MacGPG2/bin:/Applications/Ghostty.app/Contents/MacOS" +export CONDA_PREFIX="/Users/lukas/dev/mojo-rustls/output/bld/rattler-build_mojo-rustls_1726682138/build_env" diff --git a/output/bld/rattler-build_mojo-rustls_1726682138/work/conda_build.sh b/output/bld/rattler-build_mojo-rustls_1726682138/work/conda_build.sh new file mode 100644 index 0000000..c0ac9fc --- /dev/null +++ b/output/bld/rattler-build_mojo-rustls_1726682138/work/conda_build.sh @@ -0,0 +1,15 @@ + +## Start of bash preamble +if [ -z ${CONDA_BUILD+x} ]; then + source /Users/lukas/dev/mojo-rustls/output/bld/rattler-build_mojo-rustls_1726682138/work/build_env.sh +fi +# enable debug mode for the rest of the script +set -x +## End of preamble + +mkdir -p ${PREFIX}/share/mojo-rustls +git clone --depth=1 git@github.com:rustls/rustls-ffi.git +cd rustls-ffi && cargo cinstall --library-type=cdylib --destdir=./output +ls -la output/usr/local/lib +cp output/usr/local/lib/librustls.dylib ${PREFIX}/share/mojo-rustls/librustls.dylib +cd .. && rm -R rustls-ffi \ No newline at end of file diff --git a/output/bld/rattler-build_mojo-rustls_1726682138/work/rustls-ffi b/output/bld/rattler-build_mojo-rustls_1726682138/work/rustls-ffi new file mode 160000 index 0000000..326bb76 --- /dev/null +++ b/output/bld/rattler-build_mojo-rustls_1726682138/work/rustls-ffi @@ -0,0 +1 @@ +Subproject commit 326bb76f64db954a92663e87fcf620f2a615ec99 diff --git a/output/bld/rattler-build_mojo-rustls_1726683444/work/LICENSE b/output/bld/rattler-build_mojo-rustls_1726683444/work/LICENSE new file mode 100644 index 0000000..e1af563 --- /dev/null +++ b/output/bld/rattler-build_mojo-rustls_1726683444/work/LICENSE @@ -0,0 +1,21 @@ +MIT License + +Copyright (c) 2024 Mikhail Tavarez + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. diff --git a/output/bld/rattler-build_mojo-rustls_1726683444/work/build_env.sh b/output/bld/rattler-build_mojo-rustls_1726683444/work/build_env.sh new file mode 100644 index 0000000..ff326a3 --- /dev/null +++ b/output/bld/rattler-build_mojo-rustls_1726683444/work/build_env.sh @@ -0,0 +1,52 @@ +export CMAKE_GENERATOR="Unix Makefiles" +export OSX_ARCH="arm64" +export PIP_NO_DEPENDENCIES="True" +export CONDA_DEFAULT_ENV="/Users/lukas/dev/mojo-rustls/output/bld/rattler-build_mojo-rustls_1726683444/host_env_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold" +export SUBDIR="osx-arm64" +export HOME="/Users/lukas" +export CONDA_BUILD_STATE="BUILD" +export PKG_BUILD_STRING="h60d57d3_0" +export GCC_COLORS="error=01;31:warning=01;35:note=01;36:caret=01;32:locus=01:quote=01" +export PYTHON="/Users/lukas/dev/mojo-rustls/output/bld/rattler-build_mojo-rustls_1726683444/host_env_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold/bin/python" +export PKG_BUILDNUM="0" +export PIP_IGNORE_INSTALLED="True" +export CONDA_BUILD_CROSS_COMPILATION="0" +export AM_COLOR_TESTS="always" +export SSL_CERT_FILE="" +export PKG_NAME="mojo-rustls" +export MACOSX_DEPLOYMENT_TARGET="11.0" +export PKG_HASH="h60d57d3" +export PATH="/Users/lukas/dev/mojo-rustls/.magic/envs/default/bin:/Users/lukas/.modular/bin:/nix/var/nix/profiles/default/bin:/Users/lukas/.modular/pkg/packages.modular.com_nightly_max/bin:/Users/lukas/.bin:/Users/lukas/.cargo/bin:/opt/homebrew/opt/llvm/bin:/Users/lukas/.modular/pkg/packages.modular.com_nightly_mojo/bin:/Users/lukas/.nix-profile/bin:/Users/lukas/.modular/pkg/packages.modular.com_mojo/bin:/opt/homebrew/bin:/usr/local/bin:/System/Cryptexes/App/usr/bin:/usr/bin:/bin:/usr/sbin:/sbin:/var/run/com.apple.security.cryptexd/codex.system/bootstrap/usr/local/bin:/var/run/com.apple.security.cryptexd/codex.system/bootstrap/usr/bin:/var/run/com.apple.security.cryptexd/codex.system/bootstrap/usr/appleinternal/bin:/Library/Apple/usr/bin:/usr/local/MacGPG2/bin:/Applications/Ghostty.app/Contents/MacOS" +export CONDA_BUILD="1" +export PYTHONNOUSERSITE="1" +export CMAKE_COLOR_DIAGNOSTICS="ON" +export BUILD="arm64-apple-darwin20.0.0" +export BUILD_DIR="/Users/lukas/dev/mojo-rustls/output/bld/rattler-build_mojo-rustls_1726683444" +export CLICOLOR_FORCE="1" +export SHLIB_EXT=".dylib" +export ARCH="arm64" +export BUILD_PREFIX="/Users/lukas/dev/mojo-rustls/output/bld/rattler-build_mojo-rustls_1726683444/build_env" +export MAKE_TERMOUT="1" +export FORCE_COLOR="1" +export SRC_DIR="/Users/lukas/dev/mojo-rustls/output/bld/rattler-build_mojo-rustls_1726683444/work" +export SOURCE_DATE_EPOCH="1726683444" +export CPU_COUNT="16" +export PREFIX="/Users/lukas/dev/mojo-rustls/output/bld/rattler-build_mojo-rustls_1726683444/host_env_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold" +export PKG_VERSION="0.1.1" +export target_platform="osx-arm64" +export LANG="en_US.UTF-8" +export PKG_CONFIG_PATH="/Users/lukas/dev/mojo-rustls/output/bld/rattler-build_mojo-rustls_1726683444/host_env_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold/lib/pkgconfig" +export RECIPE_DIR="/Users/lukas/dev/mojo-rustls/src" +export PIP_NO_BUILD_ISOLATION="False" +export PIP_NO_INDEX="True" +export MAKEFLAGS="" +export NPY_DISTUTILS_APPEND_FLAGS="1" +export LC_ALL="en_US.UTF-8" +export PIP_CACHE_DIR="/Users/lukas/dev/mojo-rustls/output/bld/rattler-build_mojo-rustls_1726683444/pip_cache" +export build_platform="osx-arm64" + +export PATH="/Users/lukas/dev/mojo-rustls/output/bld/rattler-build_mojo-rustls_1726683444/host_env_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold/bin:/Users/lukas/.modular/bin:/nix/var/nix/profiles/default/bin:/Users/lukas/.modular/pkg/packages.modular.com_nightly_max/bin:/Users/lukas/.bin:/Users/lukas/.cargo/bin:/opt/homebrew/opt/llvm/bin:/Users/lukas/.modular/pkg/packages.modular.com_nightly_mojo/bin:/Users/lukas/.nix-profile/bin:/Users/lukas/.modular/pkg/packages.modular.com_mojo/bin:/opt/homebrew/bin:/usr/local/bin:/System/Cryptexes/App/usr/bin:/usr/bin:/bin:/usr/sbin:/sbin:/var/run/com.apple.security.cryptexd/codex.system/bootstrap/usr/local/bin:/var/run/com.apple.security.cryptexd/codex.system/bootstrap/usr/bin:/var/run/com.apple.security.cryptexd/codex.system/bootstrap/usr/appleinternal/bin:/Library/Apple/usr/bin:/usr/local/MacGPG2/bin:/Applications/Ghostty.app/Contents/MacOS" +export CONDA_PREFIX="/Users/lukas/dev/mojo-rustls/output/bld/rattler-build_mojo-rustls_1726683444/host_env_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold" + +export PATH="/Users/lukas/dev/mojo-rustls/output/bld/rattler-build_mojo-rustls_1726683444/build_env/bin:/Users/lukas/dev/mojo-rustls/output/bld/rattler-build_mojo-rustls_1726683444/host_env_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold/bin:/Users/lukas/.modular/bin:/nix/var/nix/profiles/default/bin:/Users/lukas/.modular/pkg/packages.modular.com_nightly_max/bin:/Users/lukas/.bin:/Users/lukas/.cargo/bin:/opt/homebrew/opt/llvm/bin:/Users/lukas/.modular/pkg/packages.modular.com_nightly_mojo/bin:/Users/lukas/.nix-profile/bin:/Users/lukas/.modular/pkg/packages.modular.com_mojo/bin:/opt/homebrew/bin:/usr/local/bin:/System/Cryptexes/App/usr/bin:/usr/bin:/bin:/usr/sbin:/sbin:/var/run/com.apple.security.cryptexd/codex.system/bootstrap/usr/local/bin:/var/run/com.apple.security.cryptexd/codex.system/bootstrap/usr/bin:/var/run/com.apple.security.cryptexd/codex.system/bootstrap/usr/appleinternal/bin:/Library/Apple/usr/bin:/usr/local/MacGPG2/bin:/Applications/Ghostty.app/Contents/MacOS" +export CONDA_PREFIX="/Users/lukas/dev/mojo-rustls/output/bld/rattler-build_mojo-rustls_1726683444/build_env" diff --git a/output/bld/rattler-build_mojo-rustls_1726683444/work/conda_build.sh b/output/bld/rattler-build_mojo-rustls_1726683444/work/conda_build.sh new file mode 100644 index 0000000..28f9ded --- /dev/null +++ b/output/bld/rattler-build_mojo-rustls_1726683444/work/conda_build.sh @@ -0,0 +1,15 @@ + +## Start of bash preamble +if [ -z ${CONDA_BUILD+x} ]; then + source /Users/lukas/dev/mojo-rustls/output/bld/rattler-build_mojo-rustls_1726683444/work/build_env.sh +fi +# enable debug mode for the rest of the script +set -x +## End of preamble + +mkdir -p ${PREFIX}/share/mojo-rustls +git clone --depth=1 git@github.com:rustls/rustls-ffi.git +cd rustls-ffi && cargo cinstall --library-type=cdylib --destdir=./output +ls -la output/usr/local/lib +cp output/usr/local/lib/librustls.dylib ${PREFIX}/share/mojo-rustls/librustls.dylib +cd .. && rm -R rustls-ffi \ No newline at end of file diff --git a/output/bld/rattler-build_mojo-rustls_1726683444/work/rustls-ffi b/output/bld/rattler-build_mojo-rustls_1726683444/work/rustls-ffi new file mode 160000 index 0000000..326bb76 --- /dev/null +++ b/output/bld/rattler-build_mojo-rustls_1726683444/work/rustls-ffi @@ -0,0 +1 @@ +Subproject commit 326bb76f64db954a92663e87fcf620f2a615ec99 diff --git a/output/noarch/repodata.json b/output/noarch/repodata.json new file mode 100644 index 0000000..39e6e2f --- /dev/null +++ b/output/noarch/repodata.json @@ -0,0 +1,8 @@ +{ + "info": { + "subdir": "noarch" + }, + "packages": {}, + "packages.conda": {}, + "repodata_version": 2 +} \ No newline at end of file diff --git a/output/osx-arm64/mojo-rustls-ffi-0.1.0-h60d57d3_0.conda b/output/osx-arm64/mojo-rustls-ffi-0.1.0-h60d57d3_0.conda new file mode 100644 index 0000000..aad0c55 Binary files /dev/null and b/output/osx-arm64/mojo-rustls-ffi-0.1.0-h60d57d3_0.conda differ diff --git a/output/osx-arm64/repodata.json b/output/osx-arm64/repodata.json new file mode 100644 index 0000000..f51996b --- /dev/null +++ b/output/osx-arm64/repodata.json @@ -0,0 +1,24 @@ +{ + "info": { + "subdir": "osx-arm64" + }, + "packages": {}, + "packages.conda": { + "mojo-rustls-ffi-0.1.0-h60d57d3_0.conda": { + "arch": "arm64", + "build": "h60d57d3_0", + "build_number": 0, + "depends": [], + "license": "MIT", + "md5": "43ecc615d55b8c548d1b77f69ab6adad", + "name": "mojo-rustls-ffi", + "platform": "osx", + "sha256": "f57ca18ddeba46b8c7bdad63345739d80c320fcab6ddf677b40e67b8858a4b83", + "size": 1200671, + "subdir": "osx-arm64", + "timestamp": 1726516446930, + "version": "0.1.0" + } + }, + "repodata_version": 2 +} \ No newline at end of file diff --git a/src/libc.mojo b/src/libc.mojo new file mode 100644 index 0000000..e159dce --- /dev/null +++ b/src/libc.mojo @@ -0,0 +1,1580 @@ +from utils import StaticTuple +from sys.ffi import external_call +from sys.info import sizeof, os_is_windows, os_is_macos, os_is_linux +from memory import memcpy, UnsafePointer, stack_allocation +from lightbug_http.io.bytes import Bytes + +alias IPPROTO_IPV6 = 41 +alias IPV6_V6ONLY = 26 +alias EPROTONOSUPPORT = 93 + +# Adapted from https://github.com/gabrieldemarmiesse/mojo-stdlib-extensions/ . Huge thanks to Gabriel! + +alias SUCCESS = 0 +alias GRND_NONBLOCK: UInt8 = 1 + +alias char_UnsafePointer = UnsafePointer[c_char] + +# Adapted from https://github.com/crisadamo/mojo-Libc . Huge thanks to Cristian! +# C types +alias c_void = UInt8 +alias c_char = UInt8 +alias c_schar = Int8 +alias c_uchar = UInt8 +alias c_short = Int16 +alias c_ushort = UInt16 +alias c_int = Int32 +alias c_uint = UInt32 +alias c_long = Int64 +alias c_ulong = UInt64 +alias c_float = Float32 +alias c_double = Float64 + +# `Int` is known to be machine's width +alias c_size_t = Int +alias c_ssize_t = Int + +alias ptrdiff_t = Int64 +alias intptr_t = Int64 +alias uintptr_t = UInt64 + + +# --- ( error.h Constants )----------------------------------------------------- +# TODO: These are probably platform specific, we should check the values on each linux and macos. +alias EPERM = 1 +alias ENOENT = 2 +alias ESRCH = 3 +alias EINTR = 4 +alias EIO = 5 +alias ENXIO = 6 +alias E2BIG = 7 +alias ENOEXEC = 8 +alias EBADF = 9 +alias ECHILD = 10 +alias EAGAIN = 11 +alias ENOMEM = 12 +alias EACCES = 13 +alias EFAULT = 14 +alias ENOTBLK = 15 +alias EBUSY = 16 +alias EEXIST = 17 +alias EXDEV = 18 +alias ENODEV = 19 +alias ENOTDIR = 20 +alias EISDIR = 21 +alias EINVAL = 22 +alias ENFILE = 23 +alias EMFILE = 24 +alias ENOTTY = 25 +alias ETXTBSY = 26 +alias EFBIG = 27 +alias ENOSPC = 28 +alias ESPIPE = 29 +alias EROFS = 30 +alias EMLINK = 31 +alias EPIPE = 32 +alias EDOM = 33 +alias ERANGE = 34 +alias EWOULDBLOCK = EAGAIN +alias EINPROGRESS = 36 +alias EALREADY = 37 +alias ENOTSOCK = 38 +alias EDESTADDRREQ = 39 +alias EMSGSIZE = 40 +alias ENOPROTOOPT = 42 +alias EAFNOSUPPORT = 47 +alias EADDRINUSE = 48 +alias EADDRNOTAVAIL = 49 +alias ENETUNREACH = 51 +alias ECONNABORTED = 53 +alias ECONNRESET = 54 +alias ENOBUFS = 55 +alias EISCONN = 56 +alias ENOTCONN = 57 +alias ETIMEDOUT = 60 +alias ECONNREFUSED = 61 +alias ELOOP = 62 +alias ENAMETOOLONG = 63 +alias EDQUOT = 69 +alias EPROTO = 100 +alias EOPNOTSUPP = 102 + +# --- ( Network Related Constants )--------------------------------------------- +alias sa_family_t = c_ushort +alias socklen_t = c_uint +alias in_addr_t = c_uint +alias in_port_t = c_ushort + +# TODO: These might vary on each platform...we should confirm this. +# Taken from: https://github.com/openbsd/src/blob/master/sys/sys/socket.h#L250 +# Address Family Constants +alias AF_UNSPEC = 0 # unspecified +alias AF_UNIX = 1 # local to host +alias AF_LOCAL = AF_UNIX # draft POSIX compatibility +alias AF_INET = 2 # internetwork: UDP, TCP, etc. +alias AF_IMPLINK = 3 # arpanet imp addresses +alias AF_PUP = 4 # pup protocols: e.g. BSP +alias AF_CHAOS = 5 # mit CHAOS protocols +alias AF_NS = 6 # XEROX NS protocols +alias AF_ISO = 7 # ISO protocols +alias AF_OSI = AF_ISO +alias AF_ECMA = 8 # european computer manufacturers +alias AF_DATAKIT = 9 # datakit protocols +alias AF_CCITT = 10 # CCITT protocols, X.25 etc +alias AF_SNA = 11 # IBM SNA +alias AF_DECnet = 12 # DECnet +alias AF_DLI = 13 # DEC Direct data link interface +alias AF_LAT = 14 # LAT +alias AF_HYLINK = 15 # NSC Hyperchannel +alias AF_APPLETALK = 16 # Apple Talk +alias AF_ROUTE = 17 # Internal Routing Protocol +alias AF_LINK = 18 # Link layer interface +alias pseudo_AF_XTP = 19 # eXpress Transfer Protocol (no AF) +alias AF_COIP = 20 # connection-oriented IP, aka ST II +alias AF_CNT = 21 # Computer Network Technology +alias pseudo_AF_RTIP = 22 # Help Identify RTIP packets +alias AF_IPX = 23 # Novell Internet Protocol +alias AF_INET6 = 24 # IPv6 +alias pseudo_AF_PIP = 25 # Help Identify PIP packets +alias AF_ISDN = 26 # Integrated Services Digital Network +alias AF_E164 = AF_ISDN # CCITT E.164 recommendation +alias AF_NATM = 27 # native ATM access +alias AF_ENCAP = 28 +alias AF_SIP = 29 # Simple Internet Protocol +alias AF_KEY = 30 +alias pseudo_AF_HDRCMPLT = 31 # Used by BPF to not rewrite headers in interface output routine +alias AF_BLUETOOTH = 32 # Bluetooth +alias AF_MPLS = 33 # MPLS +alias pseudo_AF_PFLOW = 34 # pflow +alias pseudo_AF_PIPEX = 35 # PIPEX +alias AF_FRAME = 36 # frame (Ethernet) sockets +alias AF_MAX = 37 + +# Protocol families, same as address families for now. +alias PF_UNSPEC = AF_UNSPEC +alias PF_LOCAL = AF_LOCAL +alias PF_UNIX = AF_UNIX +alias PF_INET = AF_INET +alias PF_IMPLINK = AF_IMPLINK +alias PF_PUP = AF_PUP +alias PF_CHAOS = AF_CHAOS +alias PF_NS = AF_NS +alias PF_ISO = AF_ISO +alias PF_OSI = AF_ISO +alias PF_ECMA = AF_ECMA +alias PF_DATAKIT = AF_DATAKIT +alias PF_CCITT = AF_CCITT +alias PF_SNA = AF_SNA +alias PF_DECnet = AF_DECnet +alias PF_DLI = AF_DLI +alias PF_LAT = AF_LAT +alias PF_HYLINK = AF_HYLINK +alias PF_APPLETALK = AF_APPLETALK +alias PF_ROUTE = AF_ROUTE +alias PF_LINK = AF_LINK +alias PF_XTP = pseudo_AF_XTP # really just proto family, no AF +alias PF_COIP = AF_COIP +alias PF_CNT = AF_CNT +alias PF_IPX = AF_IPX # same format as = AF_NS +alias PF_INET6 = AF_INET6 +alias PF_RTIP = pseudo_AF_RTIP # same format as AF_INET +alias PF_PIP = pseudo_AF_PIP +alias PF_ISDN = AF_ISDN +alias PF_NATM = AF_NATM +alias PF_ENCAP = AF_ENCAP +alias PF_SIP = AF_SIP +alias PF_KEY = AF_KEY +alias PF_BPF = pseudo_AF_HDRCMPLT +alias PF_BLUETOOTH = AF_BLUETOOTH +alias PF_MPLS = AF_MPLS +alias PF_PFLOW = pseudo_AF_PFLOW +alias PF_PIPEX = pseudo_AF_PIPEX +alias PF_FRAME = AF_FRAME +alias PF_MAX = AF_MAX + +# Socket Type constants +alias SOCK_STREAM = 1 +alias SOCK_DGRAM = 2 +alias SOCK_RAW = 3 +alias SOCK_RDM = 4 +alias SOCK_SEQPACKET = 5 +alias SOCK_DCCP = 6 +alias SOCK_PACKET = 10 +alias SOCK_CLOEXEC = O_CLOEXEC +alias SOCK_NONBLOCK = O_NONBLOCK + +# Address Information +alias AI_PASSIVE = 1 +alias AI_CANONNAME = 2 +alias AI_NUMERICHOST = 4 +alias AI_V4MAPPED = 8 +alias AI_ALL = 16 +alias AI_ADDRCONFIG = 32 +alias AI_IDN = 64 + +alias INET_ADDRSTRLEN = 16 +alias INET6_ADDRSTRLEN = 46 + +alias SHUT_RD = 0 +alias SHUT_WR = 1 +alias SHUT_RDWR = 2 + +alias SOL_SOCKET = 0xffff + +# Socket option flags +# TODO: These are probably platform specific, on MacOS I have these values, but we should check on Linux. +# Taken from: https://github.com/openbsd/src/blob/master/sys/sys/socket.h +alias SO_DEBUG = 0x0001 +alias SO_ACCEPTCONN = 0x0002 +alias SO_REUSEADDR = 0x0004 +alias SO_KEEPALIVE = 0x0008 +alias SO_DONTROUTE = 0x0010 +alias SO_BROADCAST = 0x0020 +alias SO_USELOOPBACK = 0x0040 +alias SO_LINGER = 0x0080 +alias SO_OOBINLINE = 0x0100 +alias SO_REUSEPORT = 0x0200 +alias SO_TIMESTAMP = 0x0800 +alias SO_BINDANY = 0x1000 +alias SO_ZEROIZE = 0x2000 +alias SO_SNDBUF = 0x1001 +alias SO_RCVBUF = 0x1002 +alias SO_SNDLOWAT = 0x1003 +alias SO_RCVLOWAT = 0x1004 +alias SO_SNDTIMEO = 0x1005 +alias SO_RCVTIMEO = 0x1006 +alias SO_ERROR = 0x1007 +alias SO_TYPE = 0x1008 +alias SO_NETPROC = 0x1020 +alias SO_RTABLE = 0x1021 +alias SO_PEERCRED = 0x1022 +alias SO_SPLICE = 0x1023 +alias SO_DOMAIN = 0x1024 +alias SO_PROTOCOL = 0x1025 + + +# --- ( Network Related Structs )----------------------------------------------- +@value +@register_passable("trivial") +struct in_addr: + var s_addr: in_addr_t + + +@value +@register_passable("trivial") +struct in6_addr: + var s6_addr: StaticTuple[c_char, 16] + + +@value +@register_passable("trivial") +struct sockaddr: + var sa_family: sa_family_t + var sa_data: StaticTuple[c_char, 14] + + fn __init__(out self, family: sa_family_t = 0, data: StaticTuple[c_char, 14] = StaticTuple[c_char, 14]()): + self.sa_family = family + self.sa_data = data + + +@value +@register_passable("trivial") +struct sockaddr_in: + var sin_family: sa_family_t + var sin_port: in_port_t + var sin_addr: in_addr + var sin_zero: StaticTuple[c_char, 8] + + +@value +@register_passable("trivial") +struct sockaddr_in6: + var sin6_family: sa_family_t + var sin6_port: in_port_t + var sin6_flowinfo: c_uint + var sin6_addr: in6_addr + var sin6_scope_id: c_uint + + +@value +@register_passable("trivial") +struct addrinfo: + var ai_flags: c_int + var ai_family: c_int + var ai_socktype: c_int + var ai_protocol: c_int + var ai_addrlen: socklen_t + var ai_addr: UnsafePointer[sockaddr] + var ai_canonname: UnsafePointer[c_char] + var ai_next: UnsafePointer[c_void] + + fn __init__(out self): + self.ai_flags = 0 + self.ai_family = 0 + self.ai_socktype = 0 + self.ai_protocol = 0 + self.ai_addrlen = 0 + self.ai_addr = UnsafePointer[sockaddr]() + self.ai_canonname = UnsafePointer[c_char]() + self.ai_next = UnsafePointer[c_void]() + + +# --- ( Network Related Syscalls & Structs )------------------------------------ + + +fn htonl(hostlong: c_uint) -> c_uint: + """Libc POSIX `htonl` function. + + Args: + hostlong: A 32-bit integer in host byte order. + + Returns: + The value provided in network byte order. + + #### C Function + ```c + uint32_t htonl(uint32_t hostlong) + ``` + + #### Notes: + * Reference: https://man7.org/linux/man-pages/man3/htonl.3p.html. + """ + return external_call["htonl", c_uint, c_uint](hostlong) + + +fn htons(hostshort: c_ushort) -> c_ushort: + """Libc POSIX `htons` function. + + Args: + hostshort: A 16-bit integer in host byte order. + + Returns: + The value provided in network byte order. + + #### C Function + ```c + uint16_t htons(uint16_t hostshort) + ``` + + #### Notes: + * Reference: https://man7.org/linux/man-pages/man3/htonl.3p.html. + """ + return external_call["htons", c_ushort, c_ushort](hostshort) + + +fn ntohl(netlong: c_uint) -> c_uint: + """Libc POSIX `ntohl` function. + + Args: + netlong: A 32-bit integer in network byte order. + + Returns: + The value provided in host byte order. + + #### C Function + ```c + uint32_t ntohl(uint32_t netlong) + ``` + + #### Notes: + * Reference: https://man7.org/linux/man-pages/man3/htonl.3p.html + """ + return external_call["ntohl", c_uint, c_uint](netlong) + + +fn ntohs(netshort: c_ushort) -> c_ushort: + """Libc POSIX `ntohs` function. + + Args: + netshort: A 16-bit integer in network byte order. + + Returns: + The value provided in host byte order. + + #### C Function + ```c + uint16_t ntohs(uint16_t netshort) + ``` + + #### Notes: + * Reference: https://man7.org/linux/man-pages/man3/htonl.3p.html + """ + return external_call["ntohs", c_ushort, c_ushort](netshort) + + +fn _inet_ntop( + af: c_int, + src: UnsafePointer[c_void], + dst: UnsafePointer[c_char], + size: socklen_t, +) raises -> UnsafePointer[c_char]: + """Libc POSIX `inet_ntop` function. + + Args: + af: Address Family see AF_ aliases. + src: A UnsafePointer to a binary address. + dst: A UnsafePointer to a buffer to store the result. + size: The size of the buffer. + + Returns: + A UnsafePointer to the buffer containing the result. + + #### C Function + ```c + const char *inet_ntop(int af, const void *restrict src, char *restrict dst, socklen_t size) + ``` + + #### Notes: + * Reference: https://man7.org/linux/man-pages/man3/inet_ntop.3p.html. + """ + return external_call[ + "inet_ntop", + UnsafePointer[c_char], # FnName, RetType + c_int, + UnsafePointer[c_void], + UnsafePointer[c_char], + socklen_t, # Args + ](af, src, dst, size) + + +fn inet_ntop( + af: c_int, + src: UnsafePointer[c_void], + dst: UnsafePointer[c_char], + size: socklen_t, +) raises -> String: + """Libc POSIX `inet_ntop` function. + + Args: + af: Address Family see AF_ aliases. + src: A UnsafePointer to a binary address. + dst: A UnsafePointer to a buffer to store the result. + size: The size of the buffer. + + Returns: + A UnsafePointer to the buffer containing the result. + + Raises: + Error: If an error occurs while converting the address. + EAFNOSUPPORT: `*src` was not an `AF_INET` or `AF_INET6` family address. + ENOSPC: The buffer size, `size`, was not large enough to store the presentation form of the address. + + #### C Function + ```c + const char *inet_ntop(int af, const void *restrict src, char *restrict dst, socklen_t size) + ``` + + #### Notes: + * Reference: https://man7.org/linux/man-pages/man3/inet_ntop.3p.html. + """ + var result = _inet_ntop(af, src, dst, size) + + # `inet_ntop` returns NULL on error. + if not result: + var errno = get_errno() + if errno == EAFNOSUPPORT: + raise Error("inet_ntop Error: `*src` was not an `AF_INET` or `AF_INET6` family address.") + elif errno == ENOSPC: + raise Error("inet_ntop Error: The buffer size, `size`, was not large enough to store the presentation form of the address.") + else: + raise Error("inet_ntop Error: An error occurred while converting the address. Error code: " + str(errno)) + + # We want the string representation of the address, so it's ok to take ownership of the pointer here. + return String(ptr=result, length=int(size)) + + +fn _inet_pton(af: c_int, src: UnsafePointer[c_char], dst: UnsafePointer[c_void]) -> c_int: + """Libc POSIX `inet_pton` function. Converts a presentation format address (that is, printable form as held in a character string) + to network format (usually a struct in_addr or some other internal binary representation, in network byte order). + It returns 1 if the address was valid for the specified address family, or 0 if the address was not parseable in the specified address family, + or -1 if some system error occurred (in which case errno will have been set). + + Args: + af: Address Family see AF_ aliases. + src: A UnsafePointer to a string containing the address. + dst: A UnsafePointer to a buffer to store the result. + + Returns: + 1 on success, 0 if the input is not a valid address, -1 on error. + + #### C Function + ```c + int inet_pton(int af, const char *restrict src, void *restrict dst) + ``` + + #### Notes: + * Reference: https://man7.org/linux/man-pages/man3/inet_ntop.3p.html + """ + return external_call[ + "inet_pton", + c_int, + c_int, + UnsafePointer[c_char], + UnsafePointer[c_void], + ](af, src, dst) + + +fn inet_pton(af: c_int, src: UnsafePointer[c_char], dst: UnsafePointer[c_void]) raises: + """Libc POSIX `inet_pton` function. Converts a presentation format address (that is, printable form as held in a character string) + to network format (usually a struct in_addr or some other internal binary representation, in network byte order). + + Args: + af: Address Family see AF_ aliases. + src: A UnsafePointer to a string containing the address. + dst: A UnsafePointer to a buffer to store the result. + + Raises: + Error: If an error occurs while converting the address or the input is not a valid address. + + #### C Function + ```c + int inet_pton(int af, const char *restrict src, void *restrict dst) + ``` + + #### Notes: + * Reference: https://man7.org/linux/man-pages/man3/inet_ntop.3p.html + * This function is valid for `AF_INET` and `AF_INET6`. + """ + var result = _inet_pton(af, src, dst) + if result == 0: + raise Error("inet_pton Error: The input is not a valid address.") + elif result == -1: + var errno = get_errno() + raise Error("inet_pton Error: An error occurred while converting the address. Error code: " + str(errno)) + + +fn _socket(domain: c_int, type: c_int, protocol: c_int) -> c_int: + """Libc POSIX `socket` function. + + Args: + domain: Address Family see AF_ aliases. + type: Socket Type see SOCK_ aliases. + protocol: The protocol to use. + + Returns: + A File Descriptor or -1 in case of failure. + + #### C Function + ```c + int socket(int domain, int type, int protocol) + ``` + + #### Notes: + * Reference: https://man7.org/linux/man-pages/man3/socket.3p.html + """ + return external_call["socket", c_int, c_int, c_int, c_int](domain, type, protocol) + + +fn socket(domain: c_int, type: c_int, protocol: c_int) raises -> c_int: + """Libc POSIX `socket` function. + + Args: + domain: Address Family see AF_ aliases. + type: Socket Type see SOCK_ aliases. + protocol: The protocol to use. + + Returns: + A File Descriptor or -1 in case of failure. + + Raises: + SocketError: If an error occurs while creating the socket. + EACCES: Permission to create a socket of the specified type and/or protocol is denied. + EAFNOSUPPORT: The implementation does not support the specified address family. + EINVAL: Invalid flags in type, Unknown protocol, or protocol family not available. + EMFILE: The per-process limit on the number of open file descriptors has been reached. + ENFILE: The system-wide limit on the total number of open files has been reached. + ENOBUFS or ENOMEM: Insufficient memory is available. The socket cannot be created until sufficient resources are freed. + EPROTONOSUPPORT: The protocol type or the specified protocol is not supported within this domain. + + #### C Function + ```c + int socket(int domain, int type, int protocol) + ``` + + #### Notes: + * Reference: https://man7.org/linux/man-pages/man3/socket.3p.html + """ + var fd = _socket(domain, type, protocol) + if fd == -1: + var errno = get_errno() + if errno == EACCES: + raise Error("SocketError (EACCES): Permission to create a socket of the specified type and/or protocol is denied.") + elif errno == EAFNOSUPPORT: + raise Error("SocketError (EAFNOSUPPORT): The implementation does not support the specified address family.") + elif errno == EINVAL: + raise Error("SocketError (EINVAL): Invalid flags in type, Unknown protocol, or protocol family not available.") + elif errno == EMFILE: + raise Error("SocketError (EMFILE): The per-process limit on the number of open file descriptors has been reached.") + elif errno == ENFILE: + raise Error("SocketError (ENFILE): The system-wide limit on the total number of open files has been reached.") + elif int(errno) in [ENOBUFS, ENOMEM]: + raise Error("SocketError (ENOBUFS or ENOMEM): Insufficient memory is available. The socket cannot be created until sufficient resources are freed.") + elif errno == EPROTONOSUPPORT: + raise Error("SocketError (EPROTONOSUPPORT): The protocol type or the specified protocol is not supported within this domain.") + else: + raise Error("SocketError: An error occurred while creating the socket. Error code: " + str(errno)) + + return fd + + +fn _setsockopt[origin: Origin]( + socket: c_int, + level: c_int, + option_name: c_int, + option_value: Pointer[c_void, origin], + option_len: socklen_t, +) -> c_int: + """Libc POSIX `setsockopt` function. + + Args: + socket: A File Descriptor. + level: The protocol level. + option_name: The option to set. + option_value: A Pointer to the value to set. + option_len: The size of the value. + + Returns: + 0 on success, -1 on error. + + #### C Function + ```c + int setsockopt(int socket, int level, int option_name, const void *option_value, socklen_t option_len) + ``` + + #### Notes: + * Reference: https://man7.org/linux/man-pages/man3/setsockopt.3p.html + """ + return external_call[ + "setsockopt", + c_int, # FnName, RetType + c_int, + c_int, + c_int, + Pointer[c_void, origin], + socklen_t, # Args + ](socket, level, option_name, option_value, option_len) + + +fn setsockopt[origin: Origin]( + socket: c_int, + level: c_int, + option_name: c_int, + option_value: Pointer[c_void, origin], + option_len: socklen_t, +) raises: + """Libc POSIX `setsockopt` function. Manipulate options for the socket referred to by the file descriptor, `socket`. + + Args: + socket: A File Descriptor. + level: The protocol level. + option_name: The option to set. + option_value: A UnsafePointer to the value to set. + option_len: The size of the value. + + Raises: + Error: If an error occurs while setting the socket option. + EBADF: The argument `socket` is not a valid descriptor. + EFAULT: The argument `option_value` points outside the process's allocated address space. + EINVAL: The argument `option_len` is invalid. Can sometimes occur when `option_value` is invalid. + ENOPROTOOPT: The option is unknown at the level indicated. + ENOTSOCK: The argument `socket` is not a socket. + + #### C Function + ```c + int setsockopt(int socket, int level, int option_name, const void *option_value, socklen_t option_len) + ``` + + #### Notes: + * Reference: https://man7.org/linux/man-pages/man3/setsockopt.3p.html + """ + var result = _setsockopt(socket, level, option_name, option_value, option_len) + if result == -1: + var errno = get_errno() + if errno == EBADF: + raise Error("setsockopt: The argument `socket` is not a valid descriptor.") + elif errno == EFAULT: + raise Error("setsockopt: The argument `option_value` points outside the process's allocated address space.") + elif errno == EINVAL: + raise Error("setsockopt: The argument `option_len` is invalid. Can sometimes occur when `option_value` is invalid.") + elif errno == ENOPROTOOPT: + raise Error("setsockopt: The option is unknown at the level indicated.") + elif errno == ENOTSOCK: + raise Error("setsockopt: The argument `socket` is not a socket.") + else: + raise Error("setsockopt: An error occurred while setting the socket option. Error code: " + str(errno)) + + +fn _getsockname[origin: Origin]( + socket: c_int, + address: UnsafePointer[sockaddr], + address_len: Pointer[socklen_t, origin], +) -> c_int: + """Libc POSIX `getsockname` function. + + Args: + socket: A File Descriptor. + address: A UnsafePointer to a buffer to store the address of the peer. + address_len: A UnsafePointer to the size of the buffer. + + Returns: + 0 on success, -1 on error. + + #### C Function + ```c + int getsockname(int socket, struct sockaddr *restrict address, socklen_t *restrict address_len) + ``` + + #### Notes: + * Reference: https://man7.org/linux/man-pages/man3/getsockname.3p.html + """ + return external_call[ + "getsockname", + c_int, # FnName, RetType + c_int, + UnsafePointer[sockaddr], + Pointer[socklen_t, origin], # Args + ](socket, address, address_len) + + +fn getsockname[origin: Origin]( + socket: c_int, + address: UnsafePointer[sockaddr], + address_len: Pointer[socklen_t, origin], +) raises: + """Libc POSIX `getsockname` function. + + Args: + socket: A File Descriptor. + address: A UnsafePointer to a buffer to store the address of the peer. + address_len: A UnsafePointer to the size of the buffer. + + Raises: + Error: If an error occurs while getting the socket name. + EBADF: The argument `socket` is not a valid descriptor. + EFAULT: The `address` argument points to memory not in a valid part of the process address space. + EINVAL: `address_len` is invalid (e.g., is negative). + ENOBUFS: Insufficient resources were available in the system to perform the operation. + ENOTSOCK: The argument `socket` is not a socket, it is a file. + + #### C Function + ```c + int getsockname(int socket, struct sockaddr *restrict address, socklen_t *restrict address_len) + ``` + + #### Notes: + * Reference: https://man7.org/linux/man-pages/man3/getsockname.3p.html + """ + var result = _getsockname(socket, address, address_len) + if result == -1: + var errno = get_errno() + if errno == EBADF: + raise Error("getsockname: The argument `socket` is not a valid descriptor.") + elif errno == EFAULT: + raise Error("getsockname: The `address` argument points to memory not in a valid part of the process address space.") + elif errno == EINVAL: + raise Error("getsockname: `address_len` is invalid (e.g., is negative).") + elif errno == ENOBUFS: + raise Error("getsockname: Insufficient resources were available in the system to perform the operation.") + elif errno == ENOTSOCK: + raise Error("getsockname: The argument `socket` is not a socket, it is a file.") + else: + raise Error("getsockname: An error occurred while getting the socket name. Error code: " + str(errno)) + + +fn _getpeername[origin: Origin]( + sockfd: c_int, + addr: UnsafePointer[sockaddr], + address_len: Pointer[socklen_t, origin], +) -> c_int: + """Libc POSIX `getpeername` function. + + Args: + sockfd: A File Descriptor. + addr: A UnsafePointer to a buffer to store the address of the peer. + address_len: A UnsafePointer to the size of the buffer. + + Returns: + 0 on success, -1 on error. + + #### C Function + ```c + int getpeername(int socket, struct sockaddr *restrict addr, socklen_t *restrict address_len) + ``` + + #### Notes: + * Reference: https://man7.org/linux/man-pages/man2/getpeername.2.html + """ + return external_call[ + "getpeername", + c_int, # FnName, RetType + c_int, + UnsafePointer[sockaddr], + Pointer[socklen_t, origin], # Args + ](sockfd, addr, address_len) + + +fn getpeername[origin: Origin]( + sockfd: c_int, + addr: UnsafePointer[sockaddr], + address_len: Pointer[socklen_t, origin], +) raises: + """Libc POSIX `getpeername` function. + + Args: + sockfd: A File Descriptor. + addr: A UnsafePointer to a buffer to store the address of the peer. + address_len: A UnsafePointer to the size of the buffer. + + Raises: + Error: If an error occurs while getting the socket name. + EBADF: The argument `socket` is not a valid descriptor. + EFAULT: The `addr` argument points to memory not in a valid part of the process address space. + EINVAL: `address_len` is invalid (e.g., is negative). + ENOBUFS: Insufficient resources were available in the system to perform the operation. + ENOTCONN: The socket is not connected. + ENOTSOCK: The argument `socket` is not a socket, it is a file. + + #### C Function + ```c + int getpeername(int socket, struct sockaddr *restrict addr, socklen_t *restrict address_len) + ``` + + #### Notes: + * Reference: https://man7.org/linux/man-pages/man2/getpeername.2.html + """ + var result = _getpeername(sockfd, addr, address_len) + if result == -1: + var errno = get_errno() + if errno == EBADF: + raise Error("getpeername: The argument `socket` is not a valid descriptor.") + elif errno == EFAULT: + raise Error("getpeername: The `addr` argument points to memory not in a valid part of the process address space.") + elif errno == EINVAL: + raise Error("getpeername: `address_len` is invalid (e.g., is negative).") + elif errno == ENOBUFS: + raise Error("getpeername: Insufficient resources were available in the system to perform the operation.") + elif errno == ENOTCONN: + raise Error("getpeername: The socket is not connected.") + elif errno == ENOTSOCK: + raise Error("getpeername: The argument `socket` is not a socket, it is a file.") + else: + raise Error("getpeername: An error occurred while getting the socket name. Error code: " + str(errno)) + + +fn _bind[origin: MutableOrigin](socket: c_int, address: Pointer[sockaddr_in, origin], address_len: socklen_t) -> c_int: + """Libc POSIX `bind` function. + + Args: + socket: A File Descriptor. + address: A UnsafePointer to the address to bind to. + address_len: The size of the address. + + Returns: + 0 on success, -1 on error. + + #### C Function + ```c + int bind(int socket, const struct sockaddr *address, socklen_t address_len) + ``` + + #### Notes: + * Reference: https://man7.org/linux/man-pages/man3/bind.3p.html + """ + return external_call["bind", c_int, c_int, Pointer[sockaddr_in, origin], socklen_t](socket, address, address_len) + + +fn bind[origin: MutableOrigin](socket: c_int, address: Pointer[sockaddr_in, origin], address_len: socklen_t) raises: + """Libc POSIX `bind` function. + + Args: + socket: A File Descriptor. + address: A UnsafePointer to the address to bind to. + address_len: The size of the address. + + Raises: + Error: If an error occurs while binding the socket. + EACCES: The address, `address`, is protected, and the user is not the superuser. + EADDRINUSE: The given address is already in use. + EBADF: `socket` is not a valid descriptor. + EINVAL: The socket is already bound to an address. + ENOTSOCK: `socket` is a descriptor for a file, not a socket. + + # The following errors are specific to UNIX domain (AF_UNIX) sockets + EACCES: Search permission is denied on a component of the path prefix. (See also path_resolution(7).) + EADDRNOTAVAIL: A nonexistent interface was requested or the requested address was not local. + EFAULT: `address` points outside the user's accessible address space. + EINVAL: The `address_len` is wrong, or the socket was not in the AF_UNIX family. + ELOOP: Too many symbolic links were encountered in resolving addr. + ENAMETOOLONG: `address` is too long. + ENOENT: The file does not exist. + ENOMEM: Insufficient kernel memory was available. + ENOTDIR: A component of the path prefix is not a directory. + EROFS: The socket inode would reside on a read-only file system. + + #### C Function + ```c + int bind(int socket, const struct sockaddr *address, socklen_t address_len) + ``` + + #### Notes: + * Reference: https://man7.org/linux/man-pages/man3/bind.3p.html + """ + var result = _bind(socket, address, address_len) + if result == -1: + var errno = get_errno() + if errno == EACCES: + raise Error("bind: The address, `address`, is protected, and the user is not the superuser.") + elif errno == EADDRINUSE: + raise Error("bind: The given address is already in use.") + elif errno == EBADF: + raise Error("bind: `socket` is not a valid descriptor.") + elif errno == EINVAL: + raise Error("bind: The socket is already bound to an address.") + elif errno == ENOTSOCK: + raise Error("bind: `socket` is a descriptor for a file, not a socket.") + + # The following errors are specific to UNIX domain (AF_UNIX) sockets. TODO: Pass address_family when unix sockets supported. + # if address_family == AF_UNIX: + # if errno == EACCES: + # raise Error("bind: Search permission is denied on a component of the path prefix. (See also path_resolution(7).)") + # elif errno == EADDRNOTAVAIL: + # raise Error("bind: A nonexistent interface was requested or the requested address was not local.") + # elif errno == EFAULT: + # raise Error("bind: `address` points outside the user's accessible address space.") + # elif errno == EINVAL: + # raise Error("bind: The `address_len` is wrong, or the socket was not in the AF_UNIX family.") + # elif errno == ELOOP: + # raise Error("bind: Too many symbolic links were encountered in resolving addr.") + # elif errno == ENAMETOOLONG: + # raise Error("bind: `address` is too long.") + # elif errno == ENOENT: + # raise Error("bind: The file does not exist.") + # elif errno == ENOMEM: + # raise Error("bind: Insufficient kernel memory was available.") + # elif errno == ENOTDIR: + # raise Error("bind: A component of the path prefix is not a directory.") + # elif errno == EROFS: + # raise Error("bind: The socket inode would reside on a read-only file system.") + + raise Error("bind: An error occurred while binding the socket. Error code: " + str(errno)) + + +fn _listen(socket: c_int, backlog: c_int) -> c_int: + """Libc POSIX `listen` function. + + Args: + socket: A File Descriptor. + backlog: The maximum length of the queue of pending connections. + + Returns: + 0 on success, -1 on error. + + #### C Function + ```c + int listen(int socket, int backlog) + ``` + + #### Notes: + * Reference: https://man7.org/linux/man-pages/man3/listen.3p.html + """ + return external_call["listen", c_int, c_int, c_int](socket, backlog) + + +fn listen(socket: c_int, backlog: c_int) raises: + """Libc POSIX `listen` function. + + Args: + socket: A File Descriptor. + backlog: The maximum length of the queue of pending connections. + + Raises: + Error: If an error occurs while listening on the socket. + EADDRINUSE: Another socket is already listening on the same port. + EBADF: `socket` is not a valid descriptor. + ENOTSOCK: `socket` is a descriptor for a file, not a socket. + EOPNOTSUPP: The socket is not of a type that supports the `listen()` operation. + + #### C Function + ```c + int listen(int socket, int backlog) + ``` + + #### Notes: + * Reference: https://man7.org/linux/man-pages/man3/listen.3p.html + """ + var result = _listen(socket, backlog) + if result == -1: + var errno = get_errno() + if errno == EADDRINUSE: + raise Error("listen: Another socket is already listening on the same port.") + elif errno == EBADF: + raise Error("listen: `socket` is not a valid descriptor.") + elif errno == ENOTSOCK: + raise Error("listen: `socket` is a descriptor for a file, not a socket.") + elif errno == EOPNOTSUPP: + raise Error("listen: The socket is not of a type that supports the `listen()` operation.") + else: + raise Error("listen: An error occurred while listening on the socket. Error code: " + str(errno)) + + +fn _accept[address_origin: MutableOrigin, len_origin: Origin]( + socket: c_int, + address: Pointer[sockaddr, address_origin], + address_len: Pointer[socklen_t, len_origin], +) -> c_int: + """Libc POSIX `accept` function. + + Args: + socket: A File Descriptor. + address: A UnsafePointer to a buffer to store the address of the peer. + address_len: A UnsafePointer to the size of the buffer. + + Returns: + A File Descriptor or -1 in case of failure. + + #### C Function + ```c + int accept(int socket, struct sockaddr *restrict address, socklen_t *restrict address_len) + ``` + + #### Notes: + * Reference: https://man7.org/linux/man-pages/man3/accept.3p.html + """ + return external_call[ + "accept", + c_int, # FnName, RetType + c_int, + Pointer[sockaddr, address_origin], + Pointer[socklen_t, len_origin] + ](socket, address, address_len) + + +fn accept[address_origin: MutableOrigin, len_origin: Origin]( + socket: c_int, + address: Pointer[sockaddr, address_origin], + address_len: Pointer[socklen_t, len_origin], +) raises -> c_int: + """Libc POSIX `accept` function. + + Args: + socket: A File Descriptor. + address: A UnsafePointer to a buffer to store the address of the peer. + address_len: A UnsafePointer to the size of the buffer. + + Raises: + Error: If an error occurs while listening on the socket. + EAGAIN or EWOULDBLOCK: The socket is marked nonblocking and no connections are present to be accepted. POSIX.1-2001 allows either error to be returned for this case, and does not require these constants to have the same value, so a portable application should check for both possibilities. + EBADF: `socket` is not a valid descriptor. + ECONNABORTED: `socket` is not a valid descriptor. + EFAULT: The `address` argument is not in a writable part of the user address space. + EINTR: The system call was interrupted by a signal that was caught before a valid connection arrived; see `signal(7)`. + EINVAL: Socket is not listening for connections, or `addr_length` is invalid (e.g., is negative). + EMFILE: The per-process limit of open file descriptors has been reached. + ENFILE: The system limit on the total number of open files has been reached. + ENOBUFS or ENOMEM: Not enough free memory. This often means that the memory allocation is limited by the socket buffer limits, not by the system memory. + ENOTSOCK: `socket` is a descriptor for a file, not a socket. + EOPNOTSUPP: The referenced socket is not of type `SOCK_STREAM`. + EPROTO: Protocol error. + + # Linux specific errors + EPERM: Firewall rules forbid connection. + + #### C Function + ```c + int accept(int socket, struct sockaddr *restrict address, socklen_t *restrict address_len) + ``` + + #### Notes: + * Reference: https://man7.org/linux/man-pages/man3/accept.3p.html + """ + var result = _accept(socket, address, address_len) + if result == -1: + var errno = get_errno() + if int(errno) in [EAGAIN, EWOULDBLOCK]: + raise Error("accept: The socket is marked nonblocking and no connections are present to be accepted. POSIX.1-2001 allows either error to be returned for this case, and does not require these constants to have the same value, so a portable application should check for both possibilities..") + elif errno == EBADF: + raise Error("accept: `socket` is not a valid descriptor.") + elif errno == ECONNABORTED: + raise Error("accept: `socket` is not a valid descriptor.") + elif errno == EFAULT: + raise Error("accept: The `address` argument is not in a writable part of the user address space.") + elif errno == EINTR: + raise Error("accept: The system call was interrupted by a signal that was caught before a valid connection arrived; see `signal(7)`.") + elif errno == EINVAL: + raise Error("accept: Socket is not listening for connections, or `addr_length` is invalid (e.g., is negative).") + elif errno == EMFILE: + raise Error("accept: The per-process limit of open file descriptors has been reached.") + elif errno == ENFILE: + raise Error("accept: The system limit on the total number of open files has been reached.") + elif int(errno) in [ENOBUFS, ENOMEM]: + raise Error("accept: Not enough free memory. This often means that the memory allocation is limited by the socket buffer limits, not by the system memory.") + elif errno == ENOTSOCK: + raise Error("accept: `socket` is a descriptor for a file, not a socket.") + elif errno == EOPNOTSUPP: + raise Error("accept: The referenced socket is not of type `SOCK_STREAM`.") + elif errno == EPROTO: + raise Error("accept: Protocol error.") + + @parameter + if os_is_linux(): + if errno == EPERM: + raise Error("accept: Firewall rules forbid connection.") + raise Error("accept: An error occurred while listening on the socket. Error code: " + str(errno)) + + return result + +fn _connect[origin: MutableOrigin](socket: c_int, address: Pointer[sockaddr_in, origin], address_len: socklen_t) -> c_int: + """Libc POSIX `connect` function. + + Args: socket: A File Descriptor. + address: A UnsafePointer to the address to connect to. + address_len: The size of the address. + Returns: 0 on success, -1 on error. + + #### C Function + ```c + int connect(int socket, const struct sockaddr *address, socklen_t address_len) + ``` + + #### Notes: + * Reference: https://man7.org/linux/man-pages/man3/connect.3p.html + """ + return external_call["connect", c_int](socket, address, address_len) + + +fn connect(socket: c_int, mut address: sockaddr_in, address_len: socklen_t) raises: + """Libc POSIX `connect` function. + + Args: + socket: A File Descriptor. + address: A UnsafePointer to the address to connect to. + address_len: The size of the address. + + Raises: + Error: If an error occurs while connecting to the socket. + EACCES: For UNIX domain sockets, which are identified by pathname: Write permission is denied on the socket file, or search permission is denied for one of the directories in the path prefix. (See also path_resolution(7)). + EADDRINUSE: Local address is already in use. + EAGAIN: No more free local ports or insufficient entries in the routing cache. + EALREADY: The socket is nonblocking and a previous connection attempt has not yet been completed. + EBADF: The file descriptor is not a valid index in the descriptor table. + ECONNREFUSED: No-one listening on the remote address. + EFAULT: The socket structure address is outside the user's address space. + EINPROGRESS: The socket is nonblocking and the connection cannot be completed immediately. It is possible to select(2) or poll(2) for completion by selecting the socket for writing. After select(2) indicates writability, use getsockopt(2) to read the SO_ERROR option at level SOL_SOCKET to determine whether connect() completed successfully (SO_ERROR is zero) or unsuccessfully (SO_ERROR is one of the usual error codes listed here, explaining the reason for the failure). + EINTR: The system call was interrupted by a signal that was caught. + EISCONN: The socket is already connected. + ENETUNREACH: Network is unreachable. + ENOTSOCK: The file descriptor is not associated with a socket. + EAFNOSUPPORT: The passed address didn't have the correct address family in its `sa_family` field. + ETIMEDOUT: Timeout while attempting connection. The server may be too busy to accept new connections. + + #### C Function + ```c + int connect(int socket, const struct sockaddr *address, socklen_t address_len) + ``` + + #### Notes: + * Reference: https://man7.org/linux/man-pages/man3/connect.3p.html + """ + var result = _connect(socket, Pointer.address_of(address), address_len) + if result == -1: + var errno = get_errno() + if errno == EACCES: + raise Error("connect: For UNIX domain sockets, which are identified by pathname: Write permission is denied on the socket file, or search permission is denied for one of the directories in the path prefix. (See also path_resolution(7)).") + elif errno == EADDRINUSE: + raise Error("connect: Local address is already in use.") + elif errno == EAGAIN: + raise Error("connect: No more free local ports or insufficient entries in the routing cache.") + elif errno == EALREADY: + raise Error("connect: The socket is nonblocking and a previous connection attempt has not yet been completed.") + elif errno == EBADF: + raise Error("connect: The file descriptor is not a valid index in the descriptor table.") + elif errno == ECONNREFUSED: + raise Error("connect: No-one listening on the remote address.") + elif errno == EFAULT: + raise Error("connect: The socket structure address is outside the user's address space.") + elif errno == EINPROGRESS: + raise Error("connect: The socket is nonblocking and the connection cannot be completed immediately. It is possible to select(2) or poll(2) for completion by selecting the socket for writing. After select(2) indicates writability, use getsockopt(2) to read the SO_ERROR option at level SOL_SOCKET to determine whether connect() completed successfully (SO_ERROR is zero) or unsuccessfully (SO_ERROR is one of the usual error codes listed here, explaining the reason for the failure).") + elif errno == EINTR: + raise Error("connect: The system call was interrupted by a signal that was caught.") + elif errno == EISCONN: + raise Error("connect: The socket is already connected.") + elif errno == ENETUNREACH: + raise Error("connect: Network is unreachable.") + elif errno == ENOTSOCK: + raise Error("connect: The file descriptor is not associated with a socket.") + elif errno == EAFNOSUPPORT: + raise Error("connect: The passed address didn't have the correct address family in its `sa_family` field.") + elif errno == ETIMEDOUT: + raise Error("connect: Timeout while attempting connection. The server may be too busy to accept new connections.") + else: + raise Error("connect: An error occurred while connecting to the socket. Error code: " + str(errno)) + + +fn _recv( + socket: c_int, + buffer: UnsafePointer[UInt8], + length: c_size_t, + flags: c_int, +) -> c_ssize_t: + """Libc POSIX `recv` function. + + Args: + socket: A File Descriptor. + buffer: A UnsafePointer to the buffer to store the received data. + length: The size of the buffer. + flags: Flags to control the behaviour of the function. + + Returns: + The number of bytes received or -1 in case of failure. + + #### C Function + ```c + ssize_t recv(int socket, void *buffer, size_t length, int flags) + ``` + + #### Notes: + * Reference: https://man7.org/linux/man-pages/man3/recv.3p.html + """ + return external_call[ + "recv", + c_ssize_t, # FnName, RetType + c_int, + UnsafePointer[UInt8], + c_size_t, + c_int, # Args + ](socket, buffer, length, flags) + + +fn recv( + socket: c_int, + buffer: UnsafePointer[UInt8], + length: c_size_t, + flags: c_int, +) raises -> c_ssize_t: + """Libc POSIX `recv` function. + + Args: + socket: A File Descriptor. + buffer: A UnsafePointer to the buffer to store the received data. + length: The size of the buffer. + flags: Flags to control the behaviour of the function. + + Returns: + The number of bytes received. + + #### C Function + ```c + ssize_t recv(int socket, void *buffer, size_t length, int flags) + ``` + + #### Notes: + * Reference: https://man7.org/linux/man-pages/man3/recv.3p.html + """ + var result = _recv(socket, buffer, length, flags) + if result == -1: + var errno = get_errno() + if int(errno) in [EAGAIN, EWOULDBLOCK]: + raise Error("ReceiveError: The socket is marked nonblocking and the receive operation would block, or a receive timeout had been set and the timeout expired before data was received.") + elif errno == EBADF: + raise Error("ReceiveError: The argument `socket` is an invalid descriptor.") + elif errno == ECONNREFUSED: + raise Error("ReceiveError: The remote host refused to allow the network connection (typically because it is not running the requested service).") + elif errno == EFAULT: + raise Error("ReceiveError: `buffer` points outside the process's address space.") + elif errno == EINTR: + raise Error("ReceiveError: The receive was interrupted by delivery of a signal before any data were available.") + elif errno == ENOTCONN: + raise Error("ReceiveError: The socket is not connected.") + elif errno == ENOTSOCK: + raise Error("ReceiveError: The file descriptor is not associated with a socket.") + else: + raise Error("ReceiveError: An error occurred while attempting to receive data from the socket. Error code: " + str(errno)) + + return result + + +fn _send(socket: c_int, buffer: UnsafePointer[c_void], length: c_size_t, flags: c_int) -> c_ssize_t: + """Libc POSIX `send` function. + + Args: + socket: A File Descriptor. + buffer: A UnsafePointer to the buffer to send. + length: The size of the buffer. + flags: Flags to control the behaviour of the function. + + Returns: + The number of bytes sent or -1 in case of failure. + + #### C Function + ```c + ssize_t send(int socket, const void *buffer, size_t length, int flags) + ``` + + #### Notes: + * Reference: https://man7.org/linux/man-pages/man3/send.3p.html + """ + return external_call["send", c_ssize_t](socket, buffer, length, flags) + + +fn send(socket: c_int, buffer: UnsafePointer[c_void], length: c_size_t, flags: c_int) raises -> c_ssize_t: + """Libc POSIX `send` function. + + Args: + socket: A File Descriptor. + buffer: A UnsafePointer to the buffer to send. + length: The size of the buffer. + flags: Flags to control the behaviour of the function. + + Returns: + The number of bytes sent or -1 in case of failure. + + Raises: + Error: If an error occurs while attempting to receive data from the socket. + EAGAIN or EWOULDBLOCK: The socket is marked nonblocking and the receive operation would block, or a receive timeout had been set and the timeout expired before data was received. + EBADF: The argument `socket` is an invalid descriptor. + ECONNRESET: Connection reset by peer. + EDESTADDRREQ: The socket is not connection-mode, and no peer address is set. + ECONNREFUSED: The remote host refused to allow the network connection (typically because it is not running the requested service). + EFAULT: `buffer` points outside the process's address space. + EINTR: The receive was interrupted by delivery of a signal before any data were available. + EINVAL: Invalid argument passed. + EISCONN: The connection-mode socket was connected already but a recipient was specified. + EMSGSIZE: The socket type requires that message be sent atomically, and the size of the message to be sent made this impossible. + ENOBUFS: The output queue for a network interface was full. This generally indicates that the interface has stopped sending, but may be caused by transient congestion. + ENOMEM: No memory available. + ENOTCONN: The socket is not connected. + ENOTSOCK: The file descriptor is not associated with a socket. + EOPNOTSUPP: Some bit in the flags argument is inappropriate for the socket type. + EPIPE: The local end has been shut down on a connection oriented socket. In this case the process will also receive a SIGPIPE unless MSG_NOSIGNAL is set. + + #### C Function + ```c + ssize_t send(int socket, const void *buffer, size_t length, int flags) + ``` + + #### Notes: + * Reference: https://man7.org/linux/man-pages/man3/send.3p.html + """ + var result = _send(socket, buffer, length, flags) + if result == -1: + var errno = get_errno() + if int(errno) in [EAGAIN, EWOULDBLOCK]: + raise Error("SendError: The socket is marked nonblocking and the receive operation would block, or a receive timeout had been set and the timeout expired before data was received.") + elif errno == EBADF: + raise Error("SendError: The argument `socket` is an invalid descriptor.") + elif errno == EAGAIN: + raise Error("SendError: No more free local ports or insufficient entries in the routing cache.") + elif errno == ECONNRESET: + raise Error("SendError: Connection reset by peer.") + elif errno == EDESTADDRREQ: + raise Error("SendError: The socket is not connection-mode, and no peer address is set.") + elif errno == ECONNREFUSED: + raise Error("SendError: The remote host refused to allow the network connection (typically because it is not running the requested service).") + elif errno == EFAULT: + raise Error("SendError: `buffer` points outside the process's address space.") + elif errno == EINTR: + raise Error("SendError: The receive was interrupted by delivery of a signal before any data were available.") + elif errno == EINVAL: + raise Error("SendError: Invalid argument passed.") + elif errno == EISCONN: + raise Error("SendError: The connection-mode socket was connected already but a recipient was specified.") + elif errno == EMSGSIZE: + raise Error("SendError: The socket type requires that message be sent atomically, and the size of the message to be sent made this impossible..") + elif errno == ENOBUFS: + raise Error("SendError: The output queue for a network interface was full. This generally indicates that the interface has stopped sending, but may be caused by transient congestion.") + elif errno == ENOMEM: + raise Error("SendError: No memory available.") + elif errno == ENOTCONN: + raise Error("SendError: The socket is not connected.") + elif errno == ENOTSOCK: + raise Error("SendError: The file descriptor is not associated with a socket.") + elif errno == EOPNOTSUPP: + raise Error("SendError: Some bit in the flags argument is inappropriate for the socket type.") + elif errno == EPIPE: + raise Error("SendError: The local end has been shut down on a connection oriented socket. In this case the process will also receive a SIGPIPE unless MSG_NOSIGNAL is set.") + else: + raise Error("SendError: An error occurred while attempting to receive data from the socket. Error code: " + str(errno)) + + return result + + +fn _shutdown(socket: c_int, how: c_int) -> c_int: + """Libc POSIX `shutdown` function. + + Args: + socket: A File Descriptor. + how: How to shutdown the socket. + + Returns: + 0 on success, -1 on error. + + #### C Function + ```c + int shutdown(int socket, int how) + ``` + + #### Notes: + * Reference: https://man7.org/linux/man-pages/man3/shutdown.3p.html + """ + return external_call["shutdown", c_int, c_int, c_int](socket, how) + + +fn shutdown(socket: c_int, how: c_int) raises: + """Libc POSIX `shutdown` function. + + Args: + socket: A File Descriptor. + how: How to shutdown the socket. + + Raises: + Error: If an error occurs while attempting to receive data from the socket. + EBADF: The argument `socket` is an invalid descriptor. + EINVAL: Invalid argument passed. + ENOTCONN: The socket is not connected. + ENOTSOCK: The file descriptor is not associated with a socket. + + #### C Function + ```c + int shutdown(int socket, int how) + ``` + + #### Notes: + * Reference: https://man7.org/linux/man-pages/man3/shutdown.3p.html + """ + var result = _shutdown(socket, how) + if result == -1: + var errno = get_errno() + if errno == EBADF: + raise Error("ShutdownError: The argument `socket` is an invalid descriptor.") + elif errno == EINVAL: + raise Error("ShutdownError: Invalid argument passed.") + elif errno == ENOTCONN: + raise Error("ShutdownError: The socket is not connected.") + elif errno == ENOTSOCK: + raise Error("ShutdownError: The file descriptor is not associated with a socket.") + else: + raise Error("ShutdownError: An error occurred while attempting to receive data from the socket. Error code: " + str(errno)) + + +fn gai_strerror(ecode: c_int) -> UnsafePointer[c_char]: + """Libc POSIX `gai_strerror` function. + + Args: + ecode: The error code. + + Returns: + A UnsafePointer to a string describing the error. + + #### C Function + ```c + const char *gai_strerror(int ecode) + ``` + + #### Notes: + * Reference: https://man7.org/linux/man-pages/man3/gai_strerror.3p.html + """ + return external_call["gai_strerror", UnsafePointer[c_char], c_int](ecode) + + +fn inet_pton(address_family: Int, address: String) raises -> Int: + """Converts an IP address from text to binary form. + + Args: + address_family: The address family (AF_INET or AF_INET6). + address: The IP address in text form. + + Returns: + The IP address in binary form. + """ + var ip_buf_size = 4 + if address_family == AF_INET6: + ip_buf_size = 16 + + var ip_buf = UnsafePointer[c_void].alloc(ip_buf_size) + inet_pton(rebind[c_int](address_family), address.unsafe_ptr(), ip_buf) + var result = int(ip_buf.bitcast[c_uint]()) + ip_buf.free() + return result + + +# --- ( File Related Syscalls & Structs )--------------------------------------- +alias O_NONBLOCK = 16384 +alias O_ACCMODE = 3 +alias O_CLOEXEC = 524288 + + +fn _close(fildes: c_int) -> c_int: + """Libc POSIX `close` function. + + Args: + fildes: A File Descriptor to close. + + Returns: + Upon successful completion, 0 shall be returned; otherwise, -1 + shall be returned and errno set to indicate the error. + + #### C Function + ```c + int close(int fildes). + ``` + + #### Notes: + * Reference: https://man7.org/linux/man-pages/man3/close.3p.html + """ + return external_call["close", c_int, c_int](fildes) + + +fn close(fildes: c_int) raises: + """Libc POSIX `close` function. + + Args: + fildes: A File Descriptor to close. + + Raises: + SocketError: If an error occurs while creating the socket. + EACCES: Permission to create a socket of the specified type and/or protocol is denied. + EAFNOSUPPORT: The implementation does not support the specified address family. + EINVAL: Invalid flags in type, Unknown protocol, or protocol family not available. + EMFILE: The per-process limit on the number of open file descriptors has been reached. + ENFILE: The system-wide limit on the total number of open files has been reached. + ENOBUFS or ENOMEM: Insufficient memory is available. The socket cannot be created until sufficient resources are freed. + EPROTONOSUPPORT: The protocol type or the specified protocol is not supported within this domain. + + #### C Function + ```c + int close(int fildes) + ``` + + #### Notes: + * Reference: https://man7.org/linux/man-pages/man3/close.3p.html + """ + if _close(fildes) == -1: + var errno = get_errno() + if errno == EBADF: + raise Error("CloseError (EBADF): The fildes argument is not a valid open file descriptor.") + elif errno == EINTR: + raise Error("CloseError (EINTR): The close() function was interrupted by a signal.") + elif errno == EIO: + raise Error("CloseError (EIO): An I/O error occurred while reading from or writing to the file system.") + elif int(errno) in [ENOSPC, EDQUOT]: + raise Error("CloseError (ENOSPC or EDQUOT): On NFS, these errors are not normally reported against the first write which exceeds the available storage space, but instead against a subsequent write(2), fsync(2), or close().") + else: + raise Error("SocketError: An error occurred while creating the socket. Error code: " + str(errno)) + + +fn get_errno() -> c_int: + """Get a copy of the current value of the `errno` global variable for + the current thread. + + Returns: + A copy of the current value of `errno` for the current thread. + """ + + @parameter + if os_is_windows(): + var errno = stack_allocation[1, c_int]() + _ = external_call["_get_errno", c_void](errno) + return errno[] + else: + alias loc = "__error" if os_is_macos() else "__errno_location" + return external_call[loc, UnsafePointer[c_int]]()[] diff --git a/src/recipe.yaml b/src/recipe.yaml index a609aa5..458a7d3 100644 --- a/src/recipe.yaml +++ b/src/recipe.yaml @@ -4,23 +4,24 @@ context: version: "13.4.2" # this should be changed package: - name: "mojo-rustls-ffi" - version: 0.1.0 + name: "mojo-rustls" + version: 0.1.1 source: - # - path: ./librustls.dylib - path: ../LICENSE build: script: - - mkdir -p ${PREFIX}/share/mojo-rustls-ffi + - mkdir -p ${PREFIX}/share/mojo-rustls - git clone --depth=1 git@github.com:rustls/rustls-ffi.git - - cd rustls-ffi && cargo cinstall --library-type=cdylib --destdir=${PREFIX}/share/mojo-rustls-ffi/librustls.dylib + - cd rustls-ffi && cargo cinstall --library-type=cdylib --destdir=./output + - ls -la output/usr/local/lib + - cp output/usr/local/lib/librustls.dylib ${PREFIX}/share/mojo-rustls/librustls.dylib - cd .. && rm -R rustls-ffi about: - homepage: https://github.com/rustls/mojo-rustls-ffi + homepage: https://github.com/rustls/mojo-rustls license: MIT license_file: LICENSE summary: Rustls FFI bindings - use Rustls from any language - repository: https://github.com/rustls/mojo-rustls-ffi \ No newline at end of file + repository: https://github.com/rustls/mojo-rustls \ No newline at end of file diff --git a/src/rustls/__init__.mojo b/src/rustls/__init__.mojo new file mode 100644 index 0000000..dfc531f --- /dev/null +++ b/src/rustls/__init__.mojo @@ -0,0 +1,741 @@ +import . _cffi as _c +from pathlib import Path +from os import PathLike +from utils import StaticString, StringSlice +from memory import Span, ArcPointer, UnsafePointer +from ._cffi import TlsVersion, LogLevel + + +struct Accepted: + """ + A parsed ClientHello produced by a rustls_acceptor. + + It is used to check server name indication (SNI), ALPN protocols, + signature schemes, and cipher suites. It can be combined with a + `rustls_server_config` to build a `rustls_connection`. + """ + + +struct AcceptedAlert: + """Represents a TLS alert resulting from accepting a client.""" + + pass + + +struct Acceptor: + """ + A buffer and parser for ClientHello bytes. + + This allows reading ClientHello before choosing a rustls_server_config. + + It's useful when the server config will be based on parameters in the + ClientHello: server name indication (SNI), ALPN protocols, signature + schemes, and cipher suites. + + In particular, if a server wants to do some potentially expensive work + to load a certificate for a given hostname, rustls_acceptor allows doing + that asynchronously, as opposed to rustls_server_config_builder_set_hello_callback(), + which doesn't work well for asynchronous I/O. + """ + + var _handle: UnsafePointer[_c.Acceptor] + + fn __init__(inout self): + self._handle = _c.acceptor_new() + + fn __moveinit__(inout self, owned rhs: Self): + self._handle = rhs._handle + rhs._handle = UnsafePointer[_c.Acceptor]() + + fn __del__(owned self): + _c.acceptor_free(self._handle) + + +struct Certificate: + """ + An X.509 certificate, as used in rustls. + Corresponds to `CertificateDer` in the Rust pki-types API. + + """ + + pass + + +struct CertifiedKey: + """ + The complete chain of certificates to send during a TLS handshake, + plus a private key that matches the end-entity (leaf) certificate. + + Corresponds to `CertifiedKey` in the Rust API. + + """ + + var _handle: UnsafePointer[_c.CertifiedKey] + + fn __init__( + inout self, cert_chain: Span[UInt8], private_key: Span[UInt8] + ) raises: + self._handle = UnsafePointer[_c.CertifiedKey]() + result = _c.certified_key_build( + cert_chain.unsafe_ptr(), + len(cert_chain), + private_key.unsafe_ptr(), + len(private_key), + UnsafePointer.address_of(self._handle), + ) + if result != _c.Result.ok: + raise Error("failed to create certified key" + str(result.value)) + + fn __moveinit__(inout self, owned rhs: Self): + self._handle = rhs._handle + rhs._handle = UnsafePointer[_c.CertifiedKey]() + + fn __del__(owned self): + _c.certified_key_free(self._handle) + + +struct ClientCertVerifier: + """ + A built client certificate verifier that can be provided to a `rustls_server_config_builder` + with `rustls_server_config_builder_set_client_verifier`. + """ + + var _handle: UnsafePointer[_c.ClientCertVerifier] + + +struct ClientConfig: + """ + A client config that is done being constructed and is now read-only. + + Under the hood, this object corresponds to an `Arc`. + + """ + + var _handle: UnsafePointer[_c.ClientConfig] + + fn __init__(inout self, *, unsafe_ptr: UnsafePointer[_c.ClientConfig]): + self._handle = unsafe_ptr + + fn __moveinit__(inout self, owned rhs: Self): + self._handle = rhs._handle + rhs._handle = UnsafePointer[_c.ClientConfig]() + + fn __del__(owned self): + _c.client_config_free(self._handle) + + +struct ClientConfigBuilder: + """ + A client config being constructed. + + A builder can be modified by, e.g. `rustls_client_config_builder_load_roots_from_file`. + Once you're done configuring settings, call `rustls_client_config_builder_build` + to turn it into a *rustls_client_config. + + Alternatively, if an error occurs or, you don't wish to build a config, + call `rustls_client_config_builder_free` to free the builder directly. + + This object is not safe for concurrent mutation. Under the hood, + it corresponds to a `Box`. + + """ + + var _handle: UnsafePointer[_c.ClientConfigBuilder] + + fn __init__(inout self): + self._handle = _c.client_config_builder_new() + + fn __init__( + inout self, provider: CryptoProvider, tls_versions: Span[UInt16] + ) raises: + self._handle = UnsafePointer[_c.ClientConfigBuilder]() + result = _c.client_config_builder_new_custom( + provider._handle, + tls_versions.unsafe_ptr(), + len(tls_versions), + UnsafePointer.address_of(self._handle), + ) + if result != _c.Result.ok: + raise Error("failed to create crypto provider" + str(result.value)) + + fn __moveinit__(inout self, owned rhs: Self): + self._handle = rhs._handle + rhs._handle = UnsafePointer[_c.ClientConfigBuilder]() + + fn __del__(owned self): + _c.client_config_builder_free(self._handle) + + fn set_alpn_protocols[ + lt: Origin + ](inout self, protocols: Span[Span[UInt8, lt]]) raises: + protocols_ = List[_c.SliceBytes](capacity=len(protocols)) + for p in protocols: + protocols_.append(_c.SliceBytes(p[].unsafe_ptr(), len(p[]))) + result = _c.client_config_builder_set_alpn_protocols( + self._handle, protocols_.unsafe_ptr(), len(protocols_) + ) + if result != _c.Result.ok: + raise Error("failed to set alpn protocols" + str(result.value)) + + fn set_server_verifier(inout self, verifier: ServerCertVerifier): + _c.client_config_builder_set_server_verifier( + self._handle, verifier._handle + ) + + fn set_enable_sni(inout self, enable: Bool): + _c.client_config_builder_set_enable_sni(self._handle, enable) + + fn set_certified_key( + inout self, certified_keys: Span[ArcPointer[CertifiedKey]] + ) raises: + keys = List[UnsafePointer[_c.CertifiedKey]]( + capacity=len(certified_keys) + ) + + for k in certified_keys: + keys.append(k[][]._handle) + + result = _c.client_config_builder_set_certified_key( + self._handle, keys.unsafe_ptr(), len(keys) + ) + _ = keys^ + if result != _c.Result.ok: + raise Error("failed to set certified key" + str(result.value)) + + fn build(owned self) raises -> ClientConfig: + config = ClientConfig(unsafe_ptr=UnsafePointer[_c.ClientConfig]()) + result = _c.client_config_builder_build( + self._handle, UnsafePointer.address_of(config._handle) + ) + self._handle = UnsafePointer[_c.ClientConfigBuilder]() + if result != _c.Result.ok: + raise Error("failed to build client config" + str(result.value)) + return config^ + + +struct ClientConnection: + var _handle: UnsafePointer[_c.Connection] + + fn __init__(inout self, config: ClientConfig, server_name: String) raises: + self._handle = UnsafePointer[_c.Connection]() + result = _c.client_connection_new( + config._handle, + server_name.unsafe_cstr_ptr(), + UnsafePointer.address_of(self._handle), + ) + if result != _c.Result.ok: + raise Error( + "failed to build client connection: " + str(result.value) + ) + + fn __moveinit__(inout self, owned rhs: Self): + self._handle = rhs._handle + rhs._handle = UnsafePointer[_c.Connection]() + + fn __del__(owned self): + _c.connection_free(self._handle) + + fn set_log_callback[cb: fn (LogLevel, StringSlice) -> None](inout self): + fn log( + userdata: UnsafePointer[NoneType], + params: UnsafePointer[_c.LogParams], + ): + cb( + params[].level, + StaticString(unsafe_from_utf8_strref=params[].message), + ) + + _c.connection_set_log_callback(self._handle, log) + + fn readable(self) -> Bool: + return _c.connection_wants_read(self._handle) + + fn read_tls(inout self, buf: Span[UInt8]) raises: + pass + + fn write_tls_into[ + lifetime: Origin + ](inout self, buf: Span[UInt8, lifetime]) raises: + pass + + fn writable(self) -> Bool: + return _c.connection_wants_write(self._handle) + + +struct CryptoProvider: + """ + A representation of a Rustls [`CryptoProvider`]. + """ + + var _handle: UnsafePointer[_c.CryptoProvider] + + fn __init__(inout self, *, unsafe_ptr: UnsafePointer[_c.CryptoProvider]): + self._handle = unsafe_ptr + + fn __moveinit__(inout self, owned rhs: Self): + self._handle = rhs._handle + rhs._handle = UnsafePointer[_c.CryptoProvider]() + + fn __del__(owned self): + _c.crypto_provider_free(self._handle) + + +struct CryptoProviderBuilder: + """ + A `CryptoProvider` builder. + """ + + var _handle: UnsafePointer[_c.CryptoProviderBuilder] + + fn __init__(inout self) raises: + self._handle = UnsafePointer[_c.CryptoProviderBuilder]() + result = _c.crypto_provider_builder_new_from_default( + UnsafePointer.address_of(self._handle) + ) + if result != _c.Result.ok: + raise Error( + "Failed to build crypto provider builder: " + str(result.value) + ) + + fn __moveinit__(inout self, owned rhs: Self): + self._handle = rhs._handle + rhs._handle = UnsafePointer[_c.CryptoProviderBuilder]() + + fn __del__(owned self): + _c.crypto_provider_builder_free(self._handle) + + fn set_cipher_suites( + self, cipher_suites: Span[SupportedCiphersuite] + ) raises: + result = _c.crypto_provider_builder_set_cipher_suites( + self._handle, + UnsafePointer.address_of(cipher_suites).bitcast[ + UnsafePointer[_c.SupportedCiphersuite] + ](), + len(cipher_suites), + ) + if result != _c.Result.ok: + raise Error("Failed to set ciphersuite: " + str(result.value)) + + fn build(owned self) raises -> CryptoProvider: + provider = CryptoProvider(unsafe_ptr=UnsafePointer[_c.CryptoProvider]()) + result = _c.crypto_provider_builder_build( + self._handle, UnsafePointer.address_of(provider._handle) + ) + self._handle = UnsafePointer[_c.CryptoProviderBuilder]() + if result != _c.Result.ok: + raise Error("Failed build crypto provider: " + str(result.value)) + return provider^ + + +struct IoVec: + """ + An alias for `struct iovec` from uio.h (on Unix) or `WSABUF` on Windows. + + You should cast `const struct rustls_iovec *` to `const struct iovec *` on + Unix, or `const *LPWSABUF` on Windows. See [`std::io::IoSlice`] for details + on interoperability with platform specific vectored IO. + """ + + pass + + +struct RootCertStore: + """ + A root certificate store. + + """ + + var _handle: UnsafePointer[_c.RootCertStore] + + fn __init__(inout self, *, unsafe_ptr: UnsafePointer[_c.RootCertStore]): + self._handle = unsafe_ptr + + fn __moveinit__(inout self, owned rhs: Self): + self._handle = rhs._handle + rhs._handle = UnsafePointer[_c.RootCertStore]() + + fn __del__(owned self): + _c.root_cert_store_free(self._handle) + + +struct RootCertStoreBuilder: + """ + A `rustls_root_cert_store` being constructed. + + A builder can be modified by adding trust anchor root certificates with + `rustls_root_cert_store_builder_add_pem`. Once you're done adding root certificates, + call `rustls_root_cert_store_builder_build` to turn it into a `rustls_root_cert_store`. + This object is not safe for concurrent mutation. + """ + + var _handle: UnsafePointer[_c.RootCertStoreBuilder] + + fn __init__(inout self): + self._handle = _c.root_cert_store_builder_new() + + fn __moveinit__(inout self, owned rhs: Self): + self._handle = rhs._handle + rhs._handle = UnsafePointer[_c.RootCertStoreBuilder]() + + fn __del__(owned self): + _c.root_cert_store_builder_free(self._handle) + + fn load_roots_from_file[P: PathLike](inout self, file: P) raises: + path = file.__fspath__() + result = _c.root_cert_store_builder_load_roots_from_file( + self._handle, path.unsafe_cstr_ptr(), True + ) + _ = path^ + if result != _c.Result.ok: + raise Error("Failed to load roots from file:" + str(result.value)) + + fn add_pem(inout self, pem: Span[UInt8]) raises: + result = _c.root_cert_store_builder_add_pem( + self._handle, pem.unsafe_ptr(), len(pem), True + ) + if result != _c.Result.ok: + raise Error("Failed to load roots from file:" + str(result.value)) + + fn build(owned self) raises -> RootCertStore: + store = RootCertStore(unsafe_ptr=UnsafePointer[_c.RootCertStore]()) + result = _c.root_cert_store_builder_build( + self._handle, UnsafePointer.address_of(store._handle) + ) + self._handle = UnsafePointer[_c.RootCertStoreBuilder]() + if result != _c.Result.ok: + raise Error("failed to build root cert store: " + str(result.value)) + return store^ + + +struct ServerCertVerifier: + """ + A built server certificate verifier that can be provided to a `rustls_client_config_builder` + with `rustls_client_config_builder_set_server_verifier`. + """ + + var _handle: UnsafePointer[_c.ServerCertVerifier] + + fn __init__( + inout self, *, unsafe_ptr: UnsafePointer[_c.ServerCertVerifier] + ): + self._handle = unsafe_ptr + + fn __moveinit__(inout self, owned rhs: Self): + self._handle = rhs._handle + rhs._handle = UnsafePointer[_c.ServerCertVerifier]() + + fn __del__(owned self): + _c.server_cert_verifier_free(self._handle) + + +struct ServerConfig: + """ + A server config that is done being constructed and is now read-only. + + Under the hood, this object corresponds to an `Arc`. + + """ + + var _handle: UnsafePointer[_c.ServerConfig] + + fn __init__(inout self, *, unsafe_ptr: UnsafePointer[_c.ServerConfig]): + self._handle = unsafe_ptr + + fn __moveinit__(inout self, owned rhs: Self): + self._handle = rhs._handle + rhs._handle = UnsafePointer[_c.ServerConfig]() + + fn __del__(owned self): + _c.server_config_free(self._handle) + + +struct ServerConfigBuilder: + """ + A server config being constructed. + + A builder can be modified by, + e.g. rustls_server_config_builder_load_native_roots. Once you're + done configuring settings, call rustls_server_config_builder_build + to turn it into a *const rustls_server_config. + + Alternatively, if an error occurs or, you don't wish to build a config, + call `rustls_server_config_builder_free` to free the builder directly. + + This object is not safe for concurrent mutation. + + """ + + var _handle: UnsafePointer[_c.ServerConfigBuilder] + + fn __init__(inout self): + self._handle = _c.server_config_builder_new() + + fn __del__(owned self): + _c.server_config_builder_free(self._handle) + + fn set_client_verifier(inout self, verifier: ClientCertVerifier): + _c.server_config_builder_set_client_verifier( + self._handle, verifier._handle + ) + + fn set_ignore_client_order(inout self, ignore: Bool) raises: + result = _c.server_config_builder_set_ignore_client_order( + self._handle, ignore + ) + if result != _c.Result.ok: + raise Error("failed to set ignore client order" + str(result.value)) + + fn set_alpn_protocols[ + lt: Origin + ](inout self, protocols: Span[Span[UInt8, lt]]) raises: + """ + Set the ALPN protocol list to the given protocols. + + `protocols` must point to a buffer of `rustls_slice_bytes` (built by the caller) + with `len` elements. Each element of the buffer must point to a slice of bytes that + contains a single ALPN protocol from + . + + This function makes a copy of the data in `protocols` and does not retain + any pointers, so the caller can free the pointed-to memory after calling. + + + """ + protocols_ = List[_c.SliceBytes](capacity=len(protocols)) + for p in protocols: + protocols_.append(_c.SliceBytes(p[].unsafe_ptr(), len(p[]))) + result = _c.server_config_builder_set_alpn_protocols( + self._handle, protocols_.unsafe_ptr(), len(protocols_) + ) + _ = protocols_ + if result != _c.Result.ok: + raise Error("failed to set alpn protocol" + str(result.value)) + + fn set_certified_keys( + inout self, certified_keys: Span[ArcPointer[CertifiedKey]] + ) raises: + """ + Provide the configuration a list of certificates where the connection + will select the first one that is compatible with the client's signature + verification capabilities. + + Servers that want to support both ECDSA and RSA certificates will want + the ECSDA to go first in the list. + + The built configuration will keep a reference to all certified keys + provided. The client may `rustls_certified_key_free()` afterwards + without the configuration losing them. The same certified key may also + be used in multiple configs. + + EXPERIMENTAL: installing a client_hello callback will replace any + configured certified keys and vice versa. + """ + keys = List[UnsafePointer[_c.CertifiedKey]]() + for k in certified_keys: + keys.append(k[][]._handle) + result = _c.server_config_builder_set_certified_keys( + self._handle, keys.unsafe_ptr(), len(keys) + ) + _ = keys^ + if result != _c.Result.ok: + raise Error("failed to set certified key" + str(result.value)) + + fn build(owned self) raises -> ServerConfig: + """ + Turn a *rustls_server_config_builder (mutable) into a const *rustls_server_config + (read-only). The constructed `rustls_server_config` will be written to the `config_out` + pointer when this function returns `rustls_result::Ok`. + + This function may return an error if no process default crypto provider has been set + and the builder was constructed using `rustls_server_config_builder_new`, or if no + certificate resolver was set. + """ + config = ServerConfig(unsafe_ptr=UnsafePointer[_c.ServerConfig]()) + result = _c.server_config_builder_build( + self._handle, UnsafePointer.address_of(config._handle) + ) + # Is this right? + self._handle = UnsafePointer[_c.ServerConfigBuilder]() + if result != _c.Result.ok: + raise Error("failed to build server config" + str(result.value)) + return config^ + + +struct SigningKey: + """ + A signing key that can be used to construct a certified key. + """ + + pass + + +struct SliceSliceBytes: + """ + A read-only view of a slice of Rust byte slices. + + This is used to pass data from rustls-ffi to callback functions provided + by the user of the API. Because Vec and slice are not `#[repr(C)]`, we + provide access via a pointer to an opaque struct and an accessor method + that acts on that struct to get entries of type `rustls_slice_bytes`. + Internally, the pointee is a `&[&[u8]]`. + + The memory exposed is available as specified by the function + using this in its signature. For instance, when this is a parameter to a + callback, the lifetime will usually be the duration of the callback. + Functions that receive one of these must not call its methods beyond the + allowed lifetime. + """ + + pass + + +struct SliceStr: + """ + A read-only view of a slice of multiple Rust `&str`'s (that is, multiple + strings). + + Like `rustls_str`, this guarantees that each string contains + UTF-8 and no NUL bytes. Strings are not NUL-terminated. + + This is used to pass data from rustls-ffi to callback functions provided + by the user of the API. Because Vec and slice are not `#[repr(C)]`, we + can't provide a straightforward `data` and `len` structure. Instead, we + provide access via a pointer to an opaque struct and accessor methods. + Internally, the pointee is a `&[&str]`. + + The memory exposed is available as specified by the function + using this in its signature. For instance, when this is a parameter to a + callback, the lifetime will usually be the duration of the callback. + Functions that receive one of these must not call its methods beyond the + allowed lifetime. + """ + + pass + + +fn default_crypto_provider_ciphersuites() -> SupportedCiphersuitesIterator: + return SupportedCiphersuitesIterator() + + +@value +struct SupportedCiphersuitesIterator: + """ + An iterator over rustls ciphersuites. + """ + + var index: Int + var len: Int + + fn __init__(inout self): + self.index = 0 + self.len = _c.default_crypto_provider_ciphersuites_len() + + fn __iter__(self) -> Self: + return self + + fn __next__( + inout self, + ) -> SupportedCiphersuite: + result = SupportedCiphersuite( + unsafe_ptr=_c.default_crypto_provider_ciphersuites_get(self.index) + ) + self.index += 1 + return result + + fn __has_next__(self) -> Bool: + return self.index < self.len + + fn __len__(self) -> Int: + return self.len - self.index + + +struct SupportedCiphersuite: + """ + A cipher suite supported by rustls. + """ + + var _handle: UnsafePointer[_c.SupportedCiphersuite] + + fn __init__( + inout self, *, unsafe_ptr: UnsafePointer[_c.SupportedCiphersuite] + ): + self._handle = unsafe_ptr + + fn __moveinit__(inout self, owned rhs: Self): + self._handle = rhs._handle + + fn __copyinit__(inout self, rhs: Self): + self._handle = rhs._handle + + fn __bool__(inout self) -> Bool: + return self._handle + + fn get_suite(self) -> UInt16: + return _c.supported_ciphersuite_get_suite(self._handle) + + fn get_name(self) -> StaticString: + return _c.supported_ciphersuite_get_name(self._handle) + + fn protocol_version(self) -> TlsVersion: + return _c.supported_ciphersuite_protocol_version(self._handle) + + +struct WebPkiClientCertVerifierBuilder: + """ + A client certificate verifier being constructed. + + A builder can be modified by, e.g. `rustls_web_pki_client_cert_verifier_builder_add_crl`. + + Once you're done configuring settings, call `rustls_web_pki_client_cert_verifier_builder_build` + to turn it into a `rustls_client_cert_verifier`. + + This object is not safe for concurrent mutation. + + See + for more information. + """ + + pass + + +struct WebPkiServerCertVerifierBuilder: + """ + A server certificate verifier being constructed. + + A builder can be modified by, e.g. `rustls_web_pki_server_cert_verifier_builder_add_crl`. + + Once you're done configuring settings, call `rustls_web_pki_server_cert_verifier_builder_build` + to turn it into a `rustls_server_cert_verifier`. This object is not safe for concurrent mutation. + + See + for more information. + """ + + var _handle: UnsafePointer[_c.WebPkiServerCertVerifierBuilder] + + fn __init__(inout self, store: RootCertStore): + self._handle = _c.web_pki_server_cert_verifier_builder_new( + store._handle + ) + + fn __moveinit__(inout self, owned rhs: Self): + self._handle = rhs._handle + rhs._handle = UnsafePointer[_c.WebPkiServerCertVerifierBuilder]() + + fn __del__(owned self): + _c.web_pki_server_cert_verifier_builder_free(self._handle) + + fn build(owned self) raises -> ServerCertVerifier: + verifier = ServerCertVerifier( + unsafe_ptr=UnsafePointer[_c.ServerCertVerifier]() + ) + result = _c.web_pki_server_cert_verifier_builder_build( + self._handle, UnsafePointer.address_of(verifier._handle) + ) + self._handle = UnsafePointer[_c.WebPkiServerCertVerifierBuilder]() + if result != _c.Result.ok: + raise Error( + "failed to build server cert verifier " + str(result.value) + ) + return verifier^ diff --git a/src/rustls/_cffi.mojo b/src/rustls/_cffi.mojo new file mode 100644 index 0000000..2a81a00 --- /dev/null +++ b/src/rustls/_cffi.mojo @@ -0,0 +1,3301 @@ +from sys import ffi +from utils import StringSlice, StaticString, StringRef + +var _rustls = ffi.DLHandle("/opt/homebrew/lib/librustls.dylib", ffi.RTLD.LAZY) + + +@value +struct Result: + var value: UInt32 + alias ok = Self(7000) + alias io = Self(7001) + alias null_parameter = Self(7002) + alias invalid_dns_name_error = Self(7003) + alias panic = Self(7004) + alias certificate_parse_error = Self(7005) + alias private_key_parse_error = Self(7006) + alias insufficient_size = Self(7007) + alias not_found = Self(7008) + alias invalid_parameter = Self(7009) + alias unexpected_eof = Self(7010) + alias plaintext_empty = Self(7011) + alias acceptor_not_ready = Self(7012) + alias already_used = Self(7013) + alias certificate_revocation_list_parse_error = Self(7014) + alias no_server_cert_verifier = Self(7015) + alias no_default_crypto_provider = Self(7016) + alias get_random_failed = Self(7017) + alias no_certificates_presented = Self(7101) + alias decrypt_error = Self(7102) + alias failed_to_get_current_time = Self(7103) + alias failed_to_get_random_bytes = Self(7113) + alias handshake_not_complete = Self(7104) + alias peer_sent_oversized_record = Self(7105) + alias no_application_protocol = Self(7106) + alias bad_max_fragment_size = Self(7114) + alias unsupported_name_type = Self(7115) + alias encrypt_error = Self(7116) + alias cert_encoding_bad = Self(7121) + alias cert_expired = Self(7122) + alias cert_not_yet_valid = Self(7123) + alias cert_revoked = Self(7124) + alias cert_unhandled_critical_extension = Self(7125) + alias cert_unknown_issuer = Self(7126) + alias cert_bad_signature = Self(7127) + alias cert_not_valid_for_name = Self(7128) + alias cert_invalid_purpose = Self(7129) + alias cert_application_verification_failure = Self(7130) + alias cert_other_error = Self(7131) + alias cert_unknown_revocation_status = Self(7154) + alias message_handshake_payload_too_large = Self(7133) + alias message_invalid_ccs = Self(7134) + alias message_invalid_content_type = Self(7135) + alias message_invalid_cert_status_type = Self(7136) + alias message_invalid_cert_request = Self(7137) + alias message_invalid_dh_params = Self(7138) + alias message_invalid_empty_payload = Self(7139) + alias message_invalid_key_update = Self(7140) + alias message_invalid_server_name = Self(7141) + alias message_too_large = Self(7142) + alias message_too_short = Self(7143) + alias message_missing_data = Self(7144) + alias message_missing_key_exchange = Self(7145) + alias message_no_signature_schemes = Self(7146) + alias message_trailing_data = Self(7147) + alias message_unexpected_message = Self(7148) + alias message_unknown_protocol_version = Self(7149) + alias message_unsupported_compression = Self(7150) + alias message_unsupported_curve_type = Self(7151) + alias message_unsupported_key_exchange_algorithm = Self(7152) + alias message_invalid_other = Self(7153) + alias peer_incompatible_error = Self(7107) + alias peer_misbehaved_error = Self(7108) + alias inappropriate_message = Self(7109) + alias inappropriate_handshake_message = Self(7110) + alias general = Self(7112) + alias alert_close_notify = Self(7200) + alias alert_unexpected_message = Self(7201) + alias alert_bad_record_mac = Self(7202) + alias alert_decryption_failed = Self(7203) + alias alert_record_overflow = Self(7204) + alias alert_decompression_failure = Self(7205) + alias alert_handshake_failure = Self(7206) + alias alert_no_certificate = Self(7207) + alias alert_bad_certificate = Self(7208) + alias alert_unsupported_certificate = Self(7209) + alias alert_certificate_revoked = Self(7210) + alias alert_certificate_expired = Self(7211) + alias alert_certificate_unknown = Self(7212) + alias alert_illegal_parameter = Self(7213) + alias alert_unknown_ca = Self(7214) + alias alert_access_denied = Self(7215) + alias alert_decode_error = Self(7216) + alias alert_decrypt_error = Self(7217) + alias alert_export_restriction = Self(7218) + alias alert_protocol_version = Self(7219) + alias alert_insufficient_security = Self(7220) + alias alert_internal_error = Self(7221) + alias alert_inappropriate_fallback = Self(7222) + alias alert_user_canceled = Self(7223) + alias alert_no_renegotiation = Self(7224) + alias alert_missing_extension = Self(7225) + alias alert_unsupported_extension = Self(7226) + alias alert_certificate_unobtainable = Self(7227) + alias alert_unrecognised_name = Self(7228) + alias alert_bad_certificate_status_response = Self(7229) + alias alert_bad_certificate_hash_value = Self(7230) + alias alert_unknown_psk_identity = Self(7231) + alias alert_certificate_required = Self(7232) + alias alert_no_application_protocol = Self(7233) + alias alert_unknown = Self(7234) + alias cert_revocation_list_bad_signature = Self(7400) + alias cert_revocation_list_invalid_crl_number = Self(7401) + alias cert_revocation_list_invalid_revoked_cert_serial_number = Self(7402) + alias cert_revocation_list_issuer_invalid_for_crl = Self(7403) + alias cert_revocation_list_other_error = Self(7404) + alias cert_revocation_list_parse_error = Self(7405) + alias cert_revocation_list_unsupported_crl_version = Self(7406) + alias cert_revocation_list_unsupported_critical_extension = Self(7407) + alias cert_revocation_list_unsupported_delta_crl = Self(7408) + alias cert_revocation_list_unsupported_indirect_crl = Self(7409) + alias cert_revocation_list_unsupported_revocation_reason = Self(7410) + alias client_cert_verifier_builder_no_root_anchors = Self(7500) + + fn __eq__(self, rhs: Self) -> Bool: + return self.value == rhs.value + + fn __ne__(self, rhs: Self) -> Bool: + return self.value != rhs.value + + +@value +struct TlsVersion: + """ + Definitions of known TLS protocol versions. + """ + + var value: UInt32 + + alias unknown = Self(0) + alias sslv2 = Self(512) + alias sslv3 = Self(768) + alias tlsv1_0 = Self(769) + alias tlsv1_1 = Self(770) + alias tlsv1_2 = Self(771) + alias tlsv1_3 = Self(772) + + fn __eq__(self, rhs: Self) -> Bool: + return self.value == rhs.value + + fn __ne__(self, rhs: Self) -> Bool: + return self.value != rhs.value + + +struct Accepted: + """ + A parsed ClientHello produced by a rustls_acceptor. + + It is used to check server name indication (SNI), ALPN protocols, + signature schemes, and cipher suites. It can be combined with a + `rustls_server_config` to build a `rustls_connection`. + """ + + pass + + +struct AcceptedAlert: + """Represents a TLS alert resulting from accepting a client.""" + + pass + + +struct Acceptor: + """ + A buffer and parser for ClientHello bytes. + + This allows reading ClientHello before choosing a rustls_server_config. + + It's useful when the server config will be based on parameters in the + ClientHello: server name indication (SNI), ALPN protocols, signature + schemes, and cipher suites. + + In particular, if a server wants to do some potentially expensive work + to load a certificate for a given hostname, rustls_acceptor allows doing + that asynchronously, as opposed to rustls_server_config_builder_set_hello_callback(), + which doesn't work well for asynchronous I/O. + + The general flow is: + - rustls_acceptor_new() + - Loop: + - Read bytes from the network it with rustls_acceptor_read_tls(). + - If successful, parse those bytes with rustls_acceptor_accept(). + - If that returns RUSTLS_RESULT_ACCEPTOR_NOT_READY, continue. + - Otherwise, break. + - If rustls_acceptor_accept() returned RUSTLS_RESULT_OK: + - Examine the resulting rustls_accepted. + - Create or select a rustls_server_config. + - Call rustls_accepted_into_connection(). + - Otherwise, there was a problem with the ClientHello data and the + connection should be rejected. + """ + + pass + + +struct Certificate: + """ + An X.509 certificate, as used in rustls. + Corresponds to `CertificateDer` in the Rust pki-types API. + + """ + + pass + + +struct CertifiedKey: + """ + The complete chain of certificates to send during a TLS handshake, + plus a private key that matches the end-entity (leaf) certificate. + + Corresponds to `CertifiedKey` in the Rust API. + + """ + + pass + + +struct ClientCertVerifier: + """ + A built client certificate verifier that can be provided to a `rustls_server_config_builder` + with `rustls_server_config_builder_set_client_verifier`. + """ + + pass + + +struct ClientConfig: + """ + A client config that is done being constructed and is now read-only. + + Under the hood, this object corresponds to an `Arc`. + + """ + + pass + + +struct ClientConfigBuilder: + """ + A client config being constructed. + + A builder can be modified by, e.g. `rustls_client_config_builder_load_roots_from_file`. + Once you're done configuring settings, call `rustls_client_config_builder_build` + to turn it into a *rustls_client_config. + + Alternatively, if an error occurs or, you don't wish to build a config, + call `rustls_client_config_builder_free` to free the builder directly. + + This object is not safe for concurrent mutation. Under the hood, + it corresponds to a `Box`. + + """ + + pass + + +struct Connection: + pass + + +struct CryptoProvider: + """ + A C representation of a Rustls [`CryptoProvider`]. + """ + + pass + + +struct CryptoProviderBuilder: + """ + A `rustls_crypto_provider` builder. + """ + + pass + + +struct IoVec: + """ + An alias for `struct iovec` from uio.h (on Unix) or `WSABUF` on Windows. + + You should cast `const struct rustls_iovec *` to `const struct iovec *` on + Unix, or `const *LPWSABUF` on Windows. See [`std::io::IoSlice`] for details + on interoperability with platform specific vectored IO. + """ + + pass + + +struct RootCertStore: + """ + A root certificate store. + + """ + + pass + + +struct RootCertStoreBuilder: + """ + A `rustls_root_cert_store` being constructed. + + A builder can be modified by adding trust anchor root certificates with + `rustls_root_cert_store_builder_add_pem`. Once you're done adding root certificates, + call `rustls_root_cert_store_builder_build` to turn it into a `rustls_root_cert_store`. + This object is not safe for concurrent mutation. + """ + + pass + + +struct ServerCertVerifier: + """ + A built server certificate verifier that can be provided to a `rustls_client_config_builder` + with `rustls_client_config_builder_set_server_verifier`. + """ + + pass + + +struct ServerConfig: + """ + A server config that is done being constructed and is now read-only. + + Under the hood, this object corresponds to an `Arc`. + + """ + + pass + + +struct ServerConfigBuilder: + """ + A server config being constructed. + + A builder can be modified by, + e.g. rustls_server_config_builder_load_native_roots. Once you're + done configuring settings, call rustls_server_config_builder_build + to turn it into a *const rustls_server_config. + + Alternatively, if an error occurs or, you don't wish to build a config, + call `rustls_server_config_builder_free` to free the builder directly. + + This object is not safe for concurrent mutation. + + """ + + pass + + +struct SigningKey: + """ + A signing key that can be used to construct a certified key. + """ + + pass + + +struct SliceSliceBytes: + """ + A read-only view of a slice of Rust byte slices. + + This is used to pass data from rustls-ffi to callback functions provided + by the user of the API. Because Vec and slice are not `#[repr(C)]`, we + provide access via a pointer to an opaque struct and an accessor method + that acts on that struct to get entries of type `rustls_slice_bytes`. + Internally, the pointee is a `&[&[u8]]`. + + The memory exposed is available as specified by the function + using this in its signature. For instance, when this is a parameter to a + callback, the lifetime will usually be the duration of the callback. + Functions that receive one of these must not call its methods beyond the + allowed lifetime. + """ + + pass + + +struct SliceStr: + """ + A read-only view of a slice of multiple Rust `&str`'s (that is, multiple + strings). + + Like `rustls_str`, this guarantees that each string contains + UTF-8 and no NUL bytes. Strings are not NUL-terminated. + + This is used to pass data from rustls-ffi to callback functions provided + by the user of the API. Because Vec and slice are not `#[repr(C)]`, we + can't provide a straightforward `data` and `len` structure. Instead, we + provide access via a pointer to an opaque struct and accessor methods. + Internally, the pointee is a `&[&str]`. + + The memory exposed is available as specified by the function + using this in its signature. For instance, when this is a parameter to a + callback, the lifetime will usually be the duration of the callback. + Functions that receive one of these must not call its methods beyond the + allowed lifetime. + """ + + pass + + +struct SupportedCiphersuite: + """ + A cipher suite supported by rustls. + """ + + pass + + +struct WebPkiClientCertVerifierBuilder: + """ + A client certificate verifier being constructed. + + A builder can be modified by, e.g. `rustls_web_pki_client_cert_verifier_builder_add_crl`. + + Once you're done configuring settings, call `rustls_web_pki_client_cert_verifier_builder_build` + to turn it into a `rustls_client_cert_verifier`. + + This object is not safe for concurrent mutation. + + See + for more information. + """ + + pass + + +struct WebPkiServerCertVerifierBuilder: + """ + A server certificate verifier being constructed. + + A builder can be modified by, e.g. `rustls_web_pki_server_cert_verifier_builder_add_crl`. + + Once you're done configuring settings, call `rustls_web_pki_server_cert_verifier_builder_build` + to turn it into a `rustls_server_cert_verifier`. This object is not safe for concurrent mutation. + + See + for more information. + """ + + pass + + +alias IoResult = Int32 +""" +A return value for a function that may return either success (0) or a +non-zero value representing an error. + +The values should match socket error numbers for your operating system -- +for example, the integers for `ETIMEDOUT`, `EAGAIN`, or similar. +""" + +alias ReadCallback = fn ( + userdata: UnsafePointer[NoneType], + buf: UnsafePointer[UInt8], + n: Int, + out_n: UnsafePointer[Int], +) -> IoResult +""" +A callback for `rustls_connection_read_tls`. + +An implementation of this callback should attempt to read up to n bytes from the +network, storing them in `buf`. If any bytes were stored, the implementation should +set out_n to the number of bytes stored and return 0. + +If there was an error, the implementation should return a nonzero rustls_io_result, +which will be passed through to the caller. + +On POSIX systems, returning `errno` is convenient. + +On other systems, any appropriate error code works. + +It's best to make one read attempt to the network per call. Additional reads will +be triggered by subsequent calls to one of the `_read_tls` methods. + +`userdata` is set to the value provided to `rustls_connection_set_userdata`. +In most cases that should be a struct that contains, at a minimum, a file descriptor. + +The buf and out_n pointers are borrowed and should not be retained across calls. +""" + + +@value +struct SliceBytes: + """ + A read-only view on a Rust byte slice. + + This is used to pass data from rustls-ffi to callback functions provided + by the user of the API. + `len` indicates the number of bytes than can be safely read. + + The memory exposed is available as specified by the function + using this in its signature. For instance, when this is a parameter to a + callback, the lifetime will usually be the duration of the callback. + Functions that receive one of these must not dereference the data pointer + beyond the allowed lifetime. + """ + + var data: UnsafePointer[UInt8] + var len: Int + + +alias WriteCallback = fn ( + userdata: UnsafePointer[NoneType], + buf: UnsafePointer[UInt8], + n: Int, + out_n: UnsafePointer[Int], +) -> IoResult +""" +A callback for `rustls_connection_write_tls` or `rustls_accepted_alert_write_tls`. + +An implementation of this callback should attempt to write the `n` bytes in buf +to the network. + +If any bytes were written, the implementation should set `out_n` to the number of +bytes stored and return 0. + +If there was an error, the implementation should return a nonzero `rustls_io_result`, +which will be passed through to the caller. + +On POSIX systems, returning `errno` is convenient. + +On other systems, any appropriate error code works. + +It's best to make one write attempt to the network per call. Additional writes will +be triggered by subsequent calls to rustls_connection_write_tls. + +`userdata` is set to the value provided to `rustls_connection_set_userdata`. In most +cases that should be a struct that contains, at a minimum, a file descriptor. + +The buf and out_n pointers are borrowed and should not be retained across calls. +""" + +alias VerifyServerCertUserData = UnsafePointer[NoneType] +""" +User-provided input to a custom certificate verifier callback. + +See `rustls_client_config_builder_dangerous_set_certificate_verifier()`. +""" + + +@value +struct VerifyServerCertParams: + """ + Input to a custom certificate verifier callback. + + See `rustls_client_config_builder_dangerous_set_certificate_verifier()`. + + server_name can contain a hostname, an IPv4 address in textual form, or an + IPv6 address in textual form. + """ + + var end_entity_cert_der: SliceBytes + var intermediate_certs_der: UnsafePointer[SliceSliceBytes] + var server_name: StringRef + var ocsp_response: SliceBytes + + +alias VerifyServerCertCallback = fn ( + userdata: VerifyServerCertUserData, + params: UnsafePointer[VerifyServerCertParams], +) -> UInt32 + +alias LogLevel = Int + + +@value +struct LogParams: + var level: LogLevel + var message: StringRef + + +alias LogCallback = fn ( + UnsafePointer[NoneType], UnsafePointer[LogParams] +) -> None + +alias WriteVectoredCallback = fn ( + UnsafePointer[NoneType], UnsafePointer[IoVec], Int, UnsafePointer[Int] +) -> IoResult +""" +A callback for `rustls_connection_write_tls_vectored`. + +An implementation of this callback should attempt to write the bytes in +the given `count` iovecs to the network. + +If any bytes were written, the implementation should set out_n to the number of +bytes written and return 0. + +If there was an error, the implementation should return a nonzero rustls_io_result, +which will be passed through to the caller. + +On POSIX systems, returning `errno` is convenient. + +On other systems, any appropriate error code works. + +It's best to make one write attempt to the network per call. Additional write will +be triggered by subsequent calls to one of the `_write_tls` methods. + +`userdata` is set to the value provided to `rustls_*_session_set_userdata`. In most +cases that should be a struct that contains, at a minimum, a file descriptor. + +The iov and out_n pointers are borrowed and should not be retained across calls. +""" + +alias ClientHelloUserdata = UnsafePointer[NoneType] +""" +Any context information the callback will receive when invoked. +""" + + +struct SliceU16: + """ + A read-only view on a Rust slice of 16-bit integers in platform endianness. + + This is used to pass data from rustls-ffi to callback functions provided + by the user of the API. + `len` indicates the number of bytes than can be safely read. + + The memory exposed is available as specified by the function + using this in its signature. For instance, when this is a parameter to a + callback, the lifetime will usually be the duration of the callback. + Functions that receive one of these must not dereference the data pointer + beyond the allowed lifetime. + """ + + var data: UnsafePointer[UInt16] + var len: Int + + +struct ClientHello: + """ + The TLS Client Hello information provided to a ClientHelloCallback function. + + `server_name` is the value of the ServerNameIndication extension provided + by the client. If the client did not send an SNI, the length of this + `rustls_string` will be 0. + + `signature_schemes` carries the values supplied by the client or, if the + client did not send this TLS extension, the default schemes in the rustls library. See: + . + + `alpn` carries the list of ALPN protocol names that the client proposed to + the server. Again, the length of this list will be 0 if none were supplied. + + All this data, when passed to a callback function, is only accessible during + the call and may not be modified. Users of this API must copy any values that + they want to access when the callback returned. + + EXPERIMENTAL: this feature of rustls-ffi is likely to change in the future, as + the rustls library is re-evaluating their current approach to client hello handling. + """ + + var server_name: StringRef + var signature_schemes: SliceU16 + var alpn: UnsafePointer[SliceSliceBytes] + + +alias ClientHelloCallback = fn ( + ClientHelloUserdata, UnsafePointer[ClientHello] +) -> UnsafePointer[CertifiedKey] +""" +Prototype of a callback that can be installed by the application at the +`rustls_server_config`. + +This callback will be invoked by a `rustls_connection` once the TLS client +hello message has been received. + +`userdata` will be set based on rustls_connection_set_userdata. + +`hello` gives the value of the available client announcements, as interpreted +by rustls. See the definition of `rustls_client_hello` for details. + +NOTE: +- the passed in `hello` and all its values are only available during the + callback invocations. +- the passed callback function must be safe to call multiple times concurrently + with the same userdata, unless there is only a single config and connection + where it is installed. + +EXPERIMENTAL: this feature of rustls-ffi is likely to change in the future, as +the rustls library is re-evaluating their current approach to client hello handling. +""" + +alias SessionStoreUserdata = UnsafePointer[NoneType] +""" +Any context information the callback will receive when invoked. +""" + +alias SessionStoreGetCallback = fn ( + SessionStoreUserdata, + UnsafePointer[SliceBytes], + Int32, + UnsafePointer[UInt8], + Int, + UnsafePointer[Int], +) -> UInt32 +""" +Prototype of a callback that can be installed by the application at the +`rustls_server_config` or `rustls_client_config`. + +This callback will be invoked by a TLS session when looking up the data +for a TLS session id. + +`userdata` will be supplied based on rustls_{client,server}_session_set_userdata. + +The `buf` points to `count` consecutive bytes where the +callback is expected to copy the result to. The number of copied bytes +needs to be written to `out_n`. The callback should not read any +data from `buf`. + +If the value to copy is larger than `count`, the callback should never +do a partial copy but instead remove the value from its store and +act as if it was never found. + +The callback should return RUSTLS_RESULT_OK to indicate that a value was +retrieved and written in its entirety into `buf`, or RUSTLS_RESULT_NOT_FOUND +if no session was retrieved. + +When `remove_after` is != 0, the returned data needs to be removed +from the store. + +NOTE: the passed in `key` and `buf` are only available during the +callback invocation. +NOTE: callbacks used in several sessions via a common config +must be implemented thread-safe. +""" + +alias SessionStorePutCallback = fn ( + SessionStoreUserdata, UnsafePointer[SliceBytes], UnsafePointer[SliceBytes] +) -> UInt32 +""" +Prototype of a callback that can be installed by the application at the +`rustls_server_config` or `rustls_client_config`. + +This callback will be invoked by a TLS session when a TLS session +been created and an id for later use is handed to the client/has +been received from the server. + +`userdata` will be supplied based on rustls_{client,server}_session_set_userdata. + +The callback should return RUSTLS_RESULT_OK to indicate that a value was +successfully stored, or RUSTLS_RESULT_IO on failure. + +NOTE: the passed in `key` and `val` are only available during the +callback invocation. +NOTE: callbacks used in several sessions via a common config +must be implemented thread-safe. +""" + +var ALL_VERSIONS = _rustls.get_symbol[UInt16]("RUSTLS_ALL_VERSIONS") +""" +Rustls' list of supported protocol versions. The length of the array is +given by `RUSTLS_ALL_VERSIONS_LEN`. +""" + +var ALL_VERSIONS_LEN = _rustls.get_symbol[Int]("RUSTLS_ALL_VERSIONS_LEN")[] +""" +The length of the array `RUSTLS_ALL_VERSIONS`. +""" + + +var DEFAULT_VERSIONS = _rustls.get_symbol[UInt16]("RUSTLS_DEFAULT_VERSIONS") +""" +Rustls' default list of protocol versions. The length of the array is +given by `RUSTLS_DEFAULT_VERSIONS_LEN`. +""" +var DEFAULT_VERSIONS_LEN = _rustls.get_symbol[Int]( + "RUSTLS_DEFAULT_VERSIONS_LEN" +)[] +""" +The length of the array `RUSTLS_DEFAULT_VERSIONS`. +""" + + +fn version() -> StaticString: + """ + Returns a static string containing the rustls-ffi version as well as the + rustls version. The string is alive for the lifetime of the program and does + not need to be freed. + """ + return StaticString( + unsafe_from_utf8_strref=_rustls.get_function[fn () -> StringRef]( + "rustls_version" + )() + ) + + +fn acceptor_new() -> UnsafePointer[Acceptor]: + """ + Create and return a new rustls_acceptor. + + Caller owns the pointed-to memory and must eventually free it with + `rustls_acceptor_free()`. + """ + return _rustls.get_function[fn () -> UnsafePointer[Acceptor]]( + "rustls_acceptor_new" + )() + + +fn acceptor_free(acceptor: UnsafePointer[Acceptor]): + """ + Free a rustls_acceptor. + + Arguments: + + acceptor: The rustls_acceptor to free. + + Calling with NULL is fine. Must not be called twice with the same value. + """ + _rustls.get_function[fn (UnsafePointer[Acceptor]) -> None]( + "rustls_acceptor_free" + )(acceptor) + + +fn acceptor_read_tls( + acceptor: UnsafePointer[Acceptor], + callback: ReadCallback, + userdata: UnsafePointer[NoneType], + out_n: UnsafePointer[Int], +) -> IoResult: + """ + Read some TLS bytes from the network into internal buffers. + + The actual network I/O is performed by `callback`, which you provide. + Rustls will invoke your callback with a suitable buffer to store the + read bytes into. You don't have to fill it up, just fill with as many + bytes as you get in one syscall. + + Arguments: + + acceptor: The rustls_acceptor to read bytes into. + callback: A function that will perform the actual network I/O. + Must be valid to call with the given userdata parameter until + this function call returns. + userdata: An opaque parameter to be passed directly to `callback`. + Note: this is distinct from the `userdata` parameter set with + `rustls_connection_set_userdata`. + out_n: An output parameter. This will be passed through to `callback`, + which should use it to store the number of bytes written. + + Returns: + + - 0: Success. You should call `rustls_acceptor_accept()` next. + - Any non-zero value: error. + + This function passes through return values from `callback`. Typically + `callback` should return an errno value. See `rustls_read_callback()` for + more details. + """ + return _rustls.get_function[ + fn ( + UnsafePointer[Acceptor], + ReadCallback, + UnsafePointer[NoneType], + UnsafePointer[Int], + ) -> IoResult + ]("rustls_acceptor_read_tls")(acceptor, callback, userdata, out_n) + + +fn acceptor_accept( + acceptor: UnsafePointer[Acceptor], + out_accepted: UnsafePointer[UnsafePointer[Accepted]], + out_alert: UnsafePointer[UnsafePointer[AcceptedAlert]], +) -> Result: + """ + Parse all TLS bytes read so far. + + If those bytes make up a ClientHello, create a rustls_accepted from them. + + Arguments: + + acceptor: The rustls_acceptor to access. + out_accepted: An output parameter. The pointed-to pointer will be set + to a new rustls_accepted only when the function returns + RUSTLS_RESULT_OK. The memory is owned by the caller and must eventually + be freed + out_alert: An output parameter. The pointed-to pointer will be set + to a new rustls_accepted_alert only when the function returns + a non-OK result. The memory is owned by the caller and must eventually + be freed with rustls_accepted_alert_free. The caller should call + rustls_accepted_alert_write_tls to write the alert bytes to the TLS + connection before freeing the rustls_accepted_alert. + + At most one of out_accepted or out_alert will be set. + + Returns: + + - RUSTLS_RESULT_OK: a ClientHello has successfully been parsed. + A pointer to a newly allocated rustls_accepted has been written to + *out_accepted. + - RUSTLS_RESULT_ACCEPTOR_NOT_READY: a full ClientHello has not yet been read. + Read more TLS bytes to continue. + - Any other rustls_result: the TLS bytes read so far cannot be parsed + as a ClientHello, and reading additional bytes won't help. + + Memory and lifetimes: + + After this method returns RUSTLS_RESULT_OK, `acceptor` is + still allocated and valid. It needs to be freed regardless of success + or failure of this function. + + Calling `rustls_acceptor_accept()` multiple times on the same + `rustls_acceptor` is acceptable from a memory perspective but pointless + from a protocol perspective. + """ + return Result(_rustls.get_function[ + fn ( + UnsafePointer[Acceptor], + UnsafePointer[UnsafePointer[Accepted]], + UnsafePointer[UnsafePointer[AcceptedAlert]], + ) -> UInt32 + ]("rustls_acceptor_accept")(acceptor, out_accepted, out_alert)) + + +fn accepted_server_name(accepted: UnsafePointer[Accepted]) -> StringRef: + """ + Get the server name indication (SNI) from the ClientHello. + + Arguments: + + accepted: The rustls_accepted to access. + + Returns: + + A rustls_str containing the SNI field. + + The returned value is valid until rustls_accepted_into_connection or + rustls_accepted_free is called on the same `accepted`. It is not owned + by the caller and does not need to be freed. + + This will be a zero-length rustls_str in these error cases: + + - The SNI contains a NUL byte. + - The `accepted` parameter was NULL. + - The `accepted` parameter was already transformed into a connection + with rustls_accepted_into_connection. + """ + return _rustls.get_function[fn (UnsafePointer[Accepted]) -> StringRef]( + "rustls_accepted_server_name" + )(accepted) + + +fn accepted_signature_scheme( + accepted: UnsafePointer[Accepted], i: Int +) -> UInt16: + """ + Get the i'th in the list of signature schemes offered in the ClientHello. + + This is useful in selecting a server certificate when there are multiple + available for the same server name, for instance when selecting + between an RSA and an ECDSA certificate. + + Arguments: + + accepted: The rustls_accepted to access. + i: Fetch the signature scheme at this offset. + + Returns: + + A TLS Signature Scheme from + + This will be 0 in these cases: + - i is greater than the number of available cipher suites. + - accepted is NULL. + - rustls_accepted_into_connection has already been called with `accepted`. + """ + return _rustls.get_function[fn (UnsafePointer[Accepted], Int) -> UInt16]( + "rustls_accepted_signature_scheme" + )(accepted, i) + + +fn accepted_cipher_suite(accepted: UnsafePointer[Accepted], i: Int) -> UInt16: + """ + Get the i'th in the list of cipher suites offered in the ClientHello. + + Arguments: + + accepted: The rustls_accepted to access. + i: Fetch the cipher suite at this offset. + + Returns: + + A cipher suite value from + + This will be 0 in these cases: + - i is greater than the number of available cipher suites. + - accepted is NULL. + - rustls_accepted_into_connection has already been called with `accepted`. + + Note that 0 is technically a valid cipher suite "TLS_NULL_WITH_NULL_NULL", + but this library will never support null ciphers. + """ + return _rustls.get_function[fn (UnsafePointer[Accepted], Int) -> UInt16]( + "rustls_accepted_cipher_suite" + )(accepted, i) + + +fn accepted_alpn(accepted: UnsafePointer[Accepted], i: Int) -> SliceBytes: + """ + Get the i'th in the list of ALPN protocols requested in the ClientHello. + + accepted: The rustls_accepted to access. + i: Fetch the ALPN value at this offset. + + Returns: + + A rustls_slice_bytes containing the i'th ALPN protocol. This may + contain internal NUL bytes and is not guaranteed to contain valid + UTF-8. + + This will be a zero-length rustls_slice bytes in these cases: + - i is greater than the number of offered ALPN protocols. + - The client did not offer the ALPN extension. + - The `accepted` parameter was already transformed into a connection + with rustls_accepted_into_connection. + + The returned value is valid until rustls_accepted_into_connection or + rustls_accepted_free is called on the same `accepted`. It is not owned + by the caller and does not need to be freed. + + If you are calling this from Rust, note that the `'static` lifetime + in the return signature is fake and must not be relied upon. + """ + return _rustls.get_function[ + fn (UnsafePointer[Accepted], Int) -> SliceBytes + ]("")(accepted, i) + + +fn accepted_into_connection( + accepted: UnsafePointer[Accepted], + config: UnsafePointer[ServerConfig], + out_conn: UnsafePointer[UnsafePointer[Connection]], + out_alert: UnsafePointer[UnsafePointer[AcceptedAlert]], +) -> Result: + """ + Turn a rustls_accepted into a rustls_connection, given the provided + rustls_server_config. + + Arguments: + + accepted: The rustls_accepted to transform. + config: The configuration with which to create this connection. + out_conn: An output parameter. The pointed-to pointer will be set + to a new rustls_connection only when the function returns + RUSTLS_RESULT_OK. + out_alert: An output parameter. The pointed-to pointer will be set + to a new rustls_accepted_alert when, and only when, the function returns + a non-OK result. The memory is owned by the caller and must eventually + be freed with rustls_accepted_alert_free. The caller should call + rustls_accepted_alert_write_tls to write the alert bytes to + the TLS connection before freeing the rustls_accepted_alert. + + At most one of out_conn or out_alert will be set. + + Returns: + + - RUSTLS_RESULT_OK: The `accepted` parameter was successfully + transformed into a rustls_connection, and *out_conn was written to. + - RUSTLS_RESULT_ALREADY_USED: This function was called twice on the + same rustls_connection. + - RUSTLS_RESULT_NULL_PARAMETER: One of the input parameters was NULL. + + Memory and lifetimes: + + In both success and failure cases, this consumes the contents of + `accepted` but does not free its allocated memory. In either case, + call rustls_accepted_free to avoid a memory leak. + + Calling accessor methods on an `accepted` after consuming it will + return zero or default values. + + The rustls_connection emitted by this function in the success case + is owned by the caller and must eventually be freed. + + This function does not take ownership of `config`. It does increment + `config`'s internal reference count, indicating that the + rustls_connection may hold a reference to it until it is done. + See the documentation for rustls_connection for details. + """ + return _rustls.get_function[fn () -> Result]( + "rustls_accepted_into_connection" + )() + + +fn accepted_free(accepted: UnsafePointer[Accepted]): + """ + Free a rustls_accepted. + + Arguments: + + accepted: The rustls_accepted to free. + + Calling with NULL is fine. Must not be called twice with the same value. + """ + pass + + +fn accepted_alert_write_tls( + accepted_alert: UnsafePointer[AcceptedAlert], + callback: WriteCallback, + userdata: UnsafePointer[NoneType], + out_n: UnsafePointer[Int], +) -> IoResult: + """ + Write some TLS bytes (an alert) to the network. + + The actual network I/O is performed by `callback`, which you provide. + Rustls will invoke your callback with a suitable buffer containing TLS + bytes to send. You don't have to write them all, just as many as you can + in one syscall. + + The `userdata` parameter is passed through directly to `callback`. Note that + this is distinct from the `userdata` parameter set with + `rustls_connection_set_userdata`. + + Returns 0 for success, or an errno value on error. Passes through return values + from callback. See [`rustls_write_callback`] or [`AcceptedAlert`] for + more details. + """ + return _rustls.get_function[ + fn ( + UnsafePointer[AcceptedAlert], + WriteCallback, + UnsafePointer[NoneType], + UnsafePointer[Int], + ) -> IoResult + ]("rustls_accepted_alert_write_tls")( + accepted_alert, callback, userdata, out_n + ) + + +fn accepted_alert_free(accepted_alert: UnsafePointer[AcceptedAlert]): + """ + Free a rustls_accepted_alert. + + Arguments: + + accepted_alert: The rustls_accepted_alert to free. + + Calling with NULL is fine. Must not be called twice with the same value. + """ + _rustls.get_function[fn (UnsafePointer[AcceptedAlert]) -> None]( + "rustls_accepted_alert_free" + )(accepted_alert) + + +fn certificate_get_der( + cert: UnsafePointer[Certificate], + out_der_data: UnsafePointer[UnsafePointer[UInt8]], + out_der_len: UnsafePointer[Int], +) -> Result: + """ + Get the DER data of the certificate itself. + The data is owned by the certificate and has the same lifetime. + """ + return _rustls.get_function[fn () -> Result]("rustls_certificate_get_der")() + + +fn supported_ciphersuite_get_suite( + supported_ciphersuite: UnsafePointer[SupportedCiphersuite], +) -> UInt16: + """ + Return a 16-bit unsigned integer corresponding to this cipher suite's assignment from + . + + The bytes from the assignment are interpreted in network order. + """ + return _rustls.get_function[ + fn (UnsafePointer[SupportedCiphersuite]) -> UInt16 + ]("rustls_supported_ciphersuite_get_suite")(supported_ciphersuite) + + +fn supported_ciphersuite_get_name( + supported_ciphersuite: UnsafePointer[SupportedCiphersuite], +) -> StaticString: + """ + Returns the name of the ciphersuite as a `rustls_str`. + + If the provided ciphersuite is invalid, the `rustls_str` will contain the + empty string. The lifetime of the `rustls_str` is the lifetime of the program, + it does not need to be freed. + """ + return StaticString( + unsafe_from_utf8_strref=_rustls.get_function[ + fn (UnsafePointer[SupportedCiphersuite]) -> StringRef + ]("rustls_supported_ciphersuite_get_name")(supported_ciphersuite) + ) + + +fn supported_ciphersuite_protocol_version( + supported_ciphersuite: UnsafePointer[SupportedCiphersuite], +) -> TlsVersion: + """ + Returns the `rustls_tls_version` of the ciphersuite. + + See also `RUSTLS_ALL_VERSIONS`. + """ + return _rustls.get_function[ + fn (UnsafePointer[SupportedCiphersuite]) -> TlsVersion + ]("rustls_supported_ciphersuite_protocol_version")(supported_ciphersuite) + + +fn certified_key_build( + cert_chain: UnsafePointer[UInt8], + cert_chain_len: Int, + private_key: UnsafePointer[UInt8], + private_key_len: Int, + certified_key_out: UnsafePointer[UnsafePointer[CertifiedKey]], +) -> Result: + """ + Build a `rustls_certified_key` from a certificate chain and a private key + and the default process-wide crypto provider. + + `cert_chain` must point to a buffer of `cert_chain_len` bytes, containing + a series of PEM-encoded certificates, with the end-entity (leaf) + certificate first. + + `private_key` must point to a buffer of `private_key_len` bytes, containing + a PEM-encoded private key in either PKCS#1, PKCS#8 or SEC#1 format when + using `aws-lc-rs` as the crypto provider. Supported formats may vary by + provider. + + On success, this writes a pointer to the newly created + `rustls_certified_key` in `certified_key_out`. That pointer must later + be freed with `rustls_certified_key_free` to avoid memory leaks. Note that + internally, this is an atomically reference-counted pointer, so even after + the original caller has called `rustls_certified_key_free`, other objects + may retain a pointer to the object. The memory will be freed when all + references are gone. + + This function does not take ownership of any of its input pointers. It + parses the pointed-to data and makes a copy of the result. You may + free the cert_chain and private_key pointers after calling it. + + Typically, you will build a `rustls_certified_key`, use it to create a + `rustls_server_config` (which increments the reference count), and then + immediately call `rustls_certified_key_free`. That leaves the + `rustls_server_config` in possession of the sole reference, so the + `rustls_certified_key`'s memory will automatically be released when + the `rustls_server_config` is freed. + """ + return Result(_rustls.get_function[ + fn ( + UnsafePointer[UInt8], + Int, + UnsafePointer[UInt8], + Int, + UnsafePointer[UnsafePointer[CertifiedKey]], + ) -> UInt32 + ]("rustls_certified_key_build")( + cert_chain, + cert_chain_len, + private_key, + private_key_len, + certified_key_out, + )) + + +fn certified_key_build_with_signing_key( + cert_chain: UnsafePointer[UInt8], + cert_chain_len: Int, + signing_key: UnsafePointer[SigningKey], + certified_key: UnsafePointer[UnsafePointer[CertifiedKey]], +) -> Result: + """ + Build a `rustls_certified_key` from a certificate chain and a + `rustls_signing_key`. + + `cert_chain` must point to a buffer of `cert_chain_len` bytes, containing + a series of PEM-encoded certificates, with the end-entity (leaf) + certificate first. + + `signing_key` must point to a `rustls_signing_key` loaded using a + `rustls_crypto_provider` and `rustls_crypto_provider_load_key()`. + + On success, this writes a pointer to the newly created + `rustls_certified_key` in `certified_key_out`. That pointer must later + be freed with `rustls_certified_key_free` to avoid memory leaks. Note that + internally, this is an atomically reference-counted pointer, so even after + the original caller has called `rustls_certified_key_free`, other objects + may retain a pointer to the object. The memory will be freed when all + references are gone. + + This function does not take ownership of any of its input pointers. It + parses the pointed-to data and makes a copy of the result. You may + free the cert_chain and private_key pointers after calling it. + + Typically, you will build a `rustls_certified_key`, use it to create a + `rustls_server_config` (which increments the reference count), and then + immediately call `rustls_certified_key_free`. That leaves the + `rustls_server_config` in possession of the sole reference, so the + `rustls_certified_key`'s memory will automatically be released when + the `rustls_server_config` is freed. + """ + return Result(_rustls.get_function[ + fn ( + UnsafePointer[UInt8], + Int, + UnsafePointer[SigningKey], + UnsafePointer[UnsafePointer[CertifiedKey]], + ) -> UInt32 + ]("rustls_certified_key_build_with_signing_key")( + cert_chain, cert_chain_len, signing_key, certified_key + )) + + +fn certified_key_get_certificate( + certified_key: UnsafePointer[CertifiedKey], i: Int +) -> UnsafePointer[Certificate]: + """ + Return the i-th rustls_certificate in the rustls_certified_key. + + 0 gives the end-entity certificate. 1 and higher give certificates from the chain. + + Indexes higher than the last available certificate return NULL. + + The returned certificate is valid until the rustls_certified_key is freed. + """ + return _rustls.get_function[ + fn (UnsafePointer[CertifiedKey], Int) -> UnsafePointer[Certificate] + ]("rustls_certified_key_get_certificate")(certified_key, i) + + +fn certified_key_clone_with_ocsp( + certified_key: UnsafePointer[CertifiedKey], + ocsp_response: UnsafePointer[SliceBytes], + cloned_key_out: UnsafePointer[UnsafePointer[CertifiedKey]], +) -> Result: + """ + Create a copy of the rustls_certified_key with the given OCSP response data + as DER encoded bytes. + + The OCSP response may be given as NULL to clear any possibly present OCSP + data from the cloned key. + + The cloned key is independent from its original and needs to be freed + by the application. + """ + return Result(_rustls.get_function[ + fn ( + UnsafePointer[CertifiedKey], + UnsafePointer[SliceBytes], + UnsafePointer[UnsafePointer[CertifiedKey]], + ) -> UInt32 + ]("rustls_certified_key_clone_with_ocsp")( + certified_key, ocsp_response, cloned_key_out + )) + + +fn certified_key_free(key: UnsafePointer[CertifiedKey]): + """ + "Free" a certified_key previously returned from `rustls_certified_key_build`. + + Since certified_key is actually an atomically reference-counted pointer, + extant certified_key may still hold an internal reference to the Rust object. + + However, C code must consider this pointer unusable after "free"ing it. + + Calling with NULL is fine. Must not be called twice with the same value. + """ + return _rustls.get_function[fn (UnsafePointer[CertifiedKey]) -> None]( + "rustls_certified_key_free" + )(key) + + +fn root_cert_store_builder_new() -> UnsafePointer[RootCertStoreBuilder]: + """ + Create a `rustls_root_cert_store_builder`. + + Caller owns the memory and may free it with `rustls_root_cert_store_free`, regardless of + whether `rustls_root_cert_store_builder_build` was called. + + If you wish to abandon the builder without calling `rustls_root_cert_store_builder_build`, + it must be freed with `rustls_root_cert_store_builder_free`. + """ + return _rustls.get_function[fn () -> UnsafePointer[RootCertStoreBuilder]]( + "rustls_root_cert_store_builder_new" + )() + + +fn root_cert_store_builder_add_pem( + builder: UnsafePointer[RootCertStoreBuilder], + pem: UnsafePointer[UInt8], + pem_len: Int, + strict: Bool, +) -> Result: + """ + Add one or more certificates to the root cert store builder using PEM + encoded data. + + When `strict` is true an error will return a `CertificateParseError` + result. So will an attempt to parse data that has zero certificates. + + When `strict` is false, unparseable root certificates will be ignored. + This may be useful on systems that have syntactically invalid root + certificates. + """ + return Result(_rustls.get_function[ + fn ( + UnsafePointer[RootCertStoreBuilder], UnsafePointer[UInt8], Int, Bool + ) -> UInt32 + ]("rustls_root_cert_store_builder_add_pem")(builder, pem, pem_len, strict)) + + +fn root_cert_store_builder_load_roots_from_file( + builder: UnsafePointer[RootCertStoreBuilder], + filename: UnsafePointer[Int8], + strict: Bool, +) -> Result: + """ + Add one or more certificates to the root cert store builder using PEM + encoded data read from the named file. + + When `strict` is true an error will return a `CertificateParseError` + result. So will an attempt to parse data that has zero certificates. + + When `strict` is false, unparseable root certificates will be ignored. + This may be useful on systems that have syntactically invalid root + certificates. + """ + return Result(_rustls.get_function[ + fn ( + UnsafePointer[RootCertStoreBuilder], + UnsafePointer[Int8], + Bool, + ) -> UInt32 + ]("rustls_root_cert_store_builder_load_roots_from_file")( + builder, filename, strict + )) + + +fn root_cert_store_builder_build( + builder: UnsafePointer[RootCertStoreBuilder], + root_cert_store_out: UnsafePointer[UnsafePointer[RootCertStore]], +) -> Result: + """ + Create a new `rustls_root_cert_store` from the builder. + + The builder is consumed and cannot be used again, but must still be freed. + + The root cert store can be used in several `rustls_web_pki_client_cert_verifier_builder_new` + instances and must be freed by the application when no longer needed. See the documentation of + `rustls_root_cert_store_free` for details about lifetime. + """ + return Result(_rustls.get_function[ + fn ( + UnsafePointer[RootCertStoreBuilder], + UnsafePointer[UnsafePointer[RootCertStore]], + ) -> UInt32 + ]("rustls_root_cert_store_builder_build")(builder, root_cert_store_out)) + + +fn root_cert_store_builder_free( + builder: UnsafePointer[RootCertStoreBuilder], +): + """ + Free a `rustls_root_cert_store_builder` previously returned from + `rustls_root_cert_store_builder_new`. + + Calling with NULL is fine. Must not be called twice with the same value. + """ + _rustls.get_function[fn (UnsafePointer[RootCertStoreBuilder]) -> None]( + "rustls_root_cert_store_builder_free" + )(builder) + + +fn root_cert_store_free(store: UnsafePointer[RootCertStore]): + """ + Free a rustls_root_cert_store previously returned from rustls_root_cert_store_builder_build. + + Calling with NULL is fine. Must not be called twice with the same value. + """ + _rustls.get_function[fn (UnsafePointer[RootCertStore]) -> None]( + "rustls_root_cert_store_free" + )(store) + + +fn client_cert_verifier_free( + verifier: UnsafePointer[ClientCertVerifier], +): + """ + Free a `rustls_client_cert_verifier` previously returned from + `rustls_client_cert_verifier_builder_build`. Calling with NULL is fine. Must not be + called twice with the same value. + """ + _rustls.get_function[fn (UnsafePointer[ClientCertVerifier]) -> None]( + "rustls_client_cert_verifier_free" + )(verifier) + + +fn web_pki_client_cert_verifier_builder_new( + store: UnsafePointer[RootCertStore], +) -> UnsafePointer[WebPkiClientCertVerifierBuilder]: + """ + Create a `rustls_web_pki_client_cert_verifier_builder` using the process-wide default + cryptography provider. + + Caller owns the memory and may eventually call `rustls_web_pki_client_cert_verifier_builder_free` + to free it, whether or not `rustls_web_pki_client_cert_verifier_builder_build` was called. + + Without further modification the builder will produce a client certificate verifier that + will require a client present a client certificate that chains to one of the trust anchors + in the provided `rustls_root_cert_store`. The root cert store must not be empty. + + Revocation checking will not be performed unless + `rustls_web_pki_client_cert_verifier_builder_add_crl` is used to add certificate revocation + lists (CRLs) to the builder. If CRLs are added, revocation checking will be performed + for the entire certificate chain unless + `rustls_web_pki_client_cert_verifier_only_check_end_entity_revocation` is used. Unknown + revocation status for certificates considered for revocation status will be treated as + an error unless `rustls_web_pki_client_cert_verifier_allow_unknown_revocation_status` is + used. + + Unauthenticated clients will not be permitted unless + `rustls_web_pki_client_cert_verifier_builder_allow_unauthenticated` is used. + + This copies the contents of the `rustls_root_cert_store`. It does not take + ownership of the pointed-to data. + """ + return _rustls.get_function[ + fn ( + UnsafePointer[RootCertStore], + ) -> UnsafePointer[WebPkiClientCertVerifierBuilder] + ]("rustls_web_pki_client_cert_verifier_builder_new")(store) + + +fn web_pki_client_cert_verifier_builder_new_with_provider( + provider: UnsafePointer[CryptoProvider], store: UnsafePointer[RootCertStore] +) -> UnsafePointer[WebPkiClientCertVerifierBuilder]: + """ + Create a `rustls_web_pki_client_cert_verifier_builder` using the specified + cryptography provider. + + Caller owns the memory and may eventually call + `rustls_web_pki_client_cert_verifier_builder_free` to free it, whether or + not `rustls_web_pki_client_cert_verifier_builder_build` was called. + + Without further modification the builder will produce a client certificate verifier that + will require a client present a client certificate that chains to one of the trust anchors + in the provided `rustls_root_cert_store`. The root cert store must not be empty. + + Revocation checking will not be performed unless + `rustls_web_pki_client_cert_verifier_builder_add_crl` is used to add certificate revocation + lists (CRLs) to the builder. If CRLs are added, revocation checking will be performed + for the entire certificate chain unless + `rustls_web_pki_client_cert_verifier_only_check_end_entity_revocation` is used. Unknown + revocation status for certificates considered for revocation status will be treated as + an error unless `rustls_web_pki_client_cert_verifier_allow_unknown_revocation_status` is + used. + + Unauthenticated clients will not be permitted unless + `rustls_web_pki_client_cert_verifier_builder_allow_unauthenticated` is used. + + This copies the contents of the `rustls_root_cert_store`. It does not take + ownership of the pointed-to data. + """ + return _rustls.get_function[ + fn ( + UnsafePointer[CryptoProvider], UnsafePointer[RootCertStore] + ) -> UnsafePointer[WebPkiClientCertVerifierBuilder] + ]("rustls_web_pki_client_cert_verifier_builder_new_with_provider")( + provider, store + ) + + +fn web_pki_client_cert_verifier_builder_add_crl( + builder: UnsafePointer[WebPkiClientCertVerifierBuilder], + crl_pem: UnsafePointer[UInt8], + crl_pem_len: Int, +) -> Result: + """ + Add one or more certificate revocation lists (CRLs) to the client certificate verifier + builder by reading the CRL content from the provided buffer of PEM encoded content. + + By default revocation checking will be performed on the entire certificate chain. To only + check the revocation status of the end entity certificate, use + `rustls_web_pki_client_cert_verifier_only_check_end_entity_revocation`. + + This function returns an error if the provided buffer is not valid PEM encoded content. + """ + return Result(_rustls.get_function[ + fn ( + UnsafePointer[WebPkiClientCertVerifierBuilder], + UnsafePointer[UInt8], + Int, + ) -> UInt32 + ]("rustls_web_pki_client_cert_verifier_builder_add_crl")( + builder, crl_pem, crl_pem_len + )) + + +fn web_pki_client_cert_verifier_only_check_end_entity_revocation( + builder: UnsafePointer[WebPkiClientCertVerifierBuilder], +) -> Result: + """ + When CRLs are provided with `rustls_web_pki_client_cert_verifier_builder_add_crl`, only + check the revocation status of end entity certificates, ignoring any intermediate certificates + in the chain. + """ + return Result(_rustls.get_function[ + fn (UnsafePointer[WebPkiClientCertVerifierBuilder],) -> UInt32 + ]("rustls_web_pki_client_cert_verifier_only_check_end_entity_revocation")( + builder + )) + + +fn web_pki_client_cert_verifier_allow_unknown_revocation_status( + builder: UnsafePointer[WebPkiClientCertVerifierBuilder], +) -> Result: + """ + When CRLs are provided with `rustls_web_pki_client_cert_verifier_builder_add_crl`, and it + isn't possible to determine the revocation status of a considered certificate, do not treat + it as an error condition. + + Overrides the default behavior where unknown revocation status is considered an error. + """ + return _rustls.get_function[fn () -> Result]( + "rustls_web_pki_client_cert_verifier_allow_unknown_revocation_status" + )() + + +fn web_pki_client_cert_verifier_builder_allow_unauthenticated( + builder: UnsafePointer[WebPkiClientCertVerifierBuilder], +) -> Result: + """ + Allow unauthenticated anonymous clients in addition to those that present a client + certificate that chains to one of the verifier's configured trust anchors. + """ + return Result(_rustls.get_function[ + fn (UnsafePointer[WebPkiClientCertVerifierBuilder]) -> UInt32 + ]("rustls_web_pki_client_cert_verifier_builder_allow_unauthenticated")( + builder + )) + + +fn web_pki_client_cert_verifier_clear_root_hint_subjects( + builder: UnsafePointer[WebPkiClientCertVerifierBuilder], +) -> Result: + """ + Clear the list of trust anchor hint subjects. + + By default, the client cert verifier will use the subjects provided by the root cert + store configured for client authentication. Calling this function will remove these + hint subjects, indicating the client should make a free choice of which certificate + to send. + """ + return Result(_rustls.get_function[ + fn (UnsafePointer[WebPkiClientCertVerifierBuilder],) -> UInt32 + ]("rustls_web_pki_client_cert_verifier_clear_root_hint_subjects")(builder)) + + +fn web_pki_client_cert_verifier_add_root_hint_subjects( + builder: UnsafePointer[WebPkiClientCertVerifierBuilder], + store: UnsafePointer[RootCertStore], +) -> Result: + """ + Add additional distinguished names to the list of trust anchor hint subjects. + + By default, the client cert verifier will use the subjects provided by the root cert + store configured for client authentication. Calling this function will add to these + existing hint subjects. Calling this function with an empty `store` will have no + effect, use `rustls_web_pki_client_cert_verifier_clear_root_hint_subjects` to clear + the subject hints. + """ + return Result(_rustls.get_function[ + fn ( + UnsafePointer[WebPkiClientCertVerifierBuilder], + UnsafePointer[RootCertStore], + ) -> UInt32 + ]("rustls_web_pki_client_cert_verifier_add_root_hint_subjects")( + builder, store + )) + + +fn web_pki_client_cert_verifier_builder_build( + builder: UnsafePointer[WebPkiClientCertVerifierBuilder], + verifier_out: UnsafePointer[UnsafePointer[ClientCertVerifier]], +) -> Result: + """ + Create a new client certificate verifier from the builder. + + The builder is consumed and cannot be used again, but must still be freed. + + The verifier can be used in several `rustls_server_config` instances and must be + freed by the application when no longer needed. See the documentation of + `rustls_web_pki_client_cert_verifier_builder_free` for details about lifetime. + """ + return Result(_rustls.get_function[ + fn ( + UnsafePointer[WebPkiClientCertVerifierBuilder], + UnsafePointer[UnsafePointer[ClientCertVerifier]], + ) -> UInt32 + ]("rustls_web_pki_client_cert_verifier_builder_build")( + builder, verifier_out + )) + + +fn web_pki_client_cert_verifier_builder_free( + builder: UnsafePointer[WebPkiClientCertVerifierBuilder], +): + """ + Free a `rustls_client_cert_verifier_builder` previously returned from + `rustls_client_cert_verifier_builder_new`. + + Calling with NULL is fine. Must not be called twice with the same value. + """ + _rustls.get_function[ + fn (UnsafePointer[WebPkiClientCertVerifierBuilder]) -> None + ]("rustls_web_pki_client_cert_verifier_builder_free")(builder) + + +fn web_pki_server_cert_verifier_builder_new( + store: UnsafePointer[RootCertStore], +) -> UnsafePointer[WebPkiServerCertVerifierBuilder]: + """ + Create a `rustls_web_pki_server_cert_verifier_builder` using the process-wide default + crypto provider. Caller owns the memory and may free it with + + Caller owns the memory and may free it with `rustls_web_pki_server_cert_verifier_builder_free`, + regardless of whether `rustls_web_pki_server_cert_verifier_builder_build` was called. + + Without further modification the builder will produce a server certificate verifier that + will require a server present a certificate that chains to one of the trust anchors + in the provided `rustls_root_cert_store`. The root cert store must not be empty. + + Revocation checking will not be performed unless + `rustls_web_pki_server_cert_verifier_builder_add_crl` is used to add certificate revocation + lists (CRLs) to the builder. If CRLs are added, revocation checking will be performed + for the entire certificate chain unless + `rustls_web_pki_server_cert_verifier_only_check_end_entity_revocation` is used. Unknown + revocation status for certificates considered for revocation status will be treated as + an error unless `rustls_web_pki_server_cert_verifier_allow_unknown_revocation_status` is + used. + + This copies the contents of the `rustls_root_cert_store`. It does not take + ownership of the pointed-to data. + """ + return _rustls.get_function[ + fn ( + UnsafePointer[RootCertStore], + ) -> UnsafePointer[WebPkiServerCertVerifierBuilder] + ]("rustls_web_pki_server_cert_verifier_builder_new")(store) + + +fn web_pki_server_cert_verifier_builder_new_with_provider( + provider: UnsafePointer[CryptoProvider], store: UnsafePointer[RootCertStore] +) -> UnsafePointer[WebPkiServerCertVerifierBuilder]: + """ + Create a `rustls_web_pki_server_cert_verifier_builder` using the specified + crypto provider. Caller owns the memory and may free it with + `rustls_web_pki_server_cert_verifier_builder_free`, regardless of whether + `rustls_web_pki_server_cert_verifier_builder_build` was called. + + Without further modification the builder will produce a server certificate verifier that + will require a server present a certificate that chains to one of the trust anchors + in the provided `rustls_root_cert_store`. The root cert store must not be empty. + + Revocation checking will not be performed unless + `rustls_web_pki_server_cert_verifier_builder_add_crl` is used to add certificate revocation + lists (CRLs) to the builder. If CRLs are added, revocation checking will be performed + for the entire certificate chain unless + `rustls_web_pki_server_cert_verifier_only_check_end_entity_revocation` is used. Unknown + revocation status for certificates considered for revocation status will be treated as + an error unless `rustls_web_pki_server_cert_verifier_allow_unknown_revocation_status` is + used. + + This copies the contents of the `rustls_root_cert_store`. It does not take + ownership of the pointed-to data. + """ + return _rustls.get_function[ + fn ( + UnsafePointer[CryptoProvider], UnsafePointer[RootCertStore] + ) -> UnsafePointer[WebPkiServerCertVerifierBuilder] + ]("rustls_web_pki_server_cert_verifier_builder_new_with_provider")( + provider, store + ) + + +fn web_pki_server_cert_verifier_builder_add_crl( + builder: UnsafePointer[WebPkiServerCertVerifierBuilder], + crl_pem: UnsafePointer[UInt8], + crl_pem_len: Int, +) -> Result: + """ + Add one or more certificate revocation lists (CRLs) to the server certificate verifier + builder by reading the CRL content from the provided buffer of PEM encoded content. + + By default revocation checking will be performed on the entire certificate chain. To only + check the revocation status of the end entity certificate, use + `rustls_web_pki_server_cert_verifier_only_check_end_entity_revocation`. + + This function returns an error if the provided buffer is not valid PEM encoded content. + """ + return Result(_rustls.get_function[ + fn ( + UnsafePointer[WebPkiServerCertVerifierBuilder], + UnsafePointer[UInt8], + Int, + ) -> UInt32 + ]("rustls_web_pki_server_cert_verifier_builder_add_crl")( + builder, crl_pem, crl_pem_len + )) + + +fn web_pki_server_cert_verifier_only_check_end_entity_revocation( + builder: UnsafePointer[WebPkiServerCertVerifierBuilder], +) -> Result: + """ + When CRLs are provided with `rustls_web_pki_server_cert_verifier_builder_add_crl`, only + check the revocation status of end entity certificates, ignoring any intermediate certificates + in the chain. + """ + return Result(_rustls.get_function[ + fn (UnsafePointer[WebPkiServerCertVerifierBuilder]) -> UInt32 + ]("rustls_web_pki_server_cert_verifier_only_check_end_entity_revocation")( + builder + )) + + +fn web_pki_server_cert_verifier_allow_unknown_revocation_status( + builder: UnsafePointer[WebPkiServerCertVerifierBuilder], +) -> Result: + """ + When CRLs are provided with `rustls_web_pki_server_cert_verifier_builder_add_crl`, and it + isn't possible to determine the revocation status of a considered certificate, do not treat + it as an error condition. + + Overrides the default behavior where unknown revocation status is considered an error. + """ + return Result(_rustls.get_function[ + fn (UnsafePointer[WebPkiServerCertVerifierBuilder]) -> UInt32 + ]("rustls_web_pki_server_cert_verifier_allow_unknown_revocation_status")( + builder + )) + + +fn web_pki_server_cert_verifier_builder_build( + builder: UnsafePointer[WebPkiServerCertVerifierBuilder], + verifier_out: UnsafePointer[UnsafePointer[ServerCertVerifier]], +) -> Result: + """ + Create a new server certificate verifier from the builder. + + The builder is consumed and cannot be used again, but must still be freed. + + The verifier can be used in several `rustls_client_config` instances and must be + freed by the application when no longer needed. See the documentation of + `rustls_web_pki_server_cert_verifier_builder_free` for details about lifetime. + """ + return Result(_rustls.get_function[ + fn ( + UnsafePointer[WebPkiServerCertVerifierBuilder], + UnsafePointer[UnsafePointer[ServerCertVerifier]], + ) -> UInt32 + ]("rustls_web_pki_server_cert_verifier_builder_build")( + builder, verifier_out + )) + + +fn web_pki_server_cert_verifier_builder_free( + builder: UnsafePointer[WebPkiServerCertVerifierBuilder], +): + """ + Free a `rustls_server_cert_verifier_builder` previously returned from + `rustls_server_cert_verifier_builder_new`. + + Calling with NULL is fine. Must not be called twice with the same value. + """ + _rustls.get_function[ + fn (UnsafePointer[WebPkiServerCertVerifierBuilder]) -> None + ]("rustls_web_pki_server_cert_verifier_builder_free")(builder) + + +fn platform_server_cert_verifier( + verifier_out: UnsafePointer[UnsafePointer[ServerCertVerifier]], +) -> Result: + """ + Create a verifier that uses the default behavior for the current platform. + + This uses [`rustls-platform-verifier`][]. + + The verifier can be used in several `rustls_client_config` instances and must be freed by + the application using `rustls_server_cert_verifier_free` when no longer needed. + + [`rustls-platform-verifier`]: https://github.com/rustls/rustls-platform-verifier + """ + return Result(_rustls.get_function[ + fn (UnsafePointer[UnsafePointer[ServerCertVerifier]],) -> UInt32 + ]("rustls_platform_server_cert_verifier")(verifier_out)) + + +fn platform_server_cert_verifier_with_provider( + provider: UnsafePointer[CryptoProvider], +) -> UnsafePointer[ServerCertVerifier]: + """ + Create a verifier that uses the default behavior for the current platform. + + This uses [`rustls-platform-verifier`][] and the specified crypto provider. + + The verifier can be used in several `rustls_client_config` instances and must be freed by + the application using `rustls_server_cert_verifier_free` when no longer needed. + + [`rustls-platform-verifier`]: https://github.com/rustls/rustls-platform-verifier + """ + return _rustls.get_function[ + fn (UnsafePointer[CryptoProvider]) -> UnsafePointer[ServerCertVerifier] + ]("rustls_platform_server_cert_verifier_with_provider")(provider) + + +fn server_cert_verifier_free( + verifier: UnsafePointer[ServerCertVerifier], +): + """ + Free a `rustls_server_cert_verifier` previously returned from + `rustls_server_cert_verifier_builder_build` or `rustls_platform_server_cert_verifier`. + + Calling with NULL is fine. Must not be called twice with the same value. + """ + _rustls.get_function[fn (UnsafePointer[ServerCertVerifier]) -> None]( + "rustls_server_cert_verifier_free" + )(verifier) + + +fn client_config_builder_new() -> UnsafePointer[ClientConfigBuilder]: + """ + Create a rustls_client_config_builder using the process default crypto provider. + + Caller owns the memory and must eventually call `rustls_client_config_builder_build`, + then free the resulting `rustls_client_config`. + + Alternatively, if an error occurs or, you don't wish to build a config, + call `rustls_client_config_builder_free` to free the builder directly. + + This uses the process default provider's values for the cipher suites and key + exchange groups, as well as safe defaults for protocol versions. + + This starts out with no trusted roots. Caller must add roots with + rustls_client_config_builder_load_roots_from_file or provide a custom verifier. + """ + return _rustls.get_function[fn () -> UnsafePointer[ClientConfigBuilder]]( + "rustls_client_config_builder_new" + )() + + +fn client_config_builder_new_custom( + provider: UnsafePointer[CryptoProvider], + tls_versions: UnsafePointer[UInt16], + tls_versions_len: Int, + builder_out: UnsafePointer[UnsafePointer[ClientConfigBuilder]], +) -> Result: + """ + Create a rustls_client_config_builder using the specified crypto provider. + + Caller owns the memory and must eventually call `rustls_client_config_builder_build`, + then free the resulting `rustls_client_config`. + + Alternatively, if an error occurs or, you don't wish to build a config, + call `rustls_client_config_builder_free` to free the builder directly. + + `tls_version` sets the TLS protocol versions to use when negotiating a TLS session. + `tls_version` is the version of the protocol, as defined in rfc8446, + ch. 4.2.1 and end of ch. 5.1. Some values are defined in + `rustls_tls_version` for convenience, and the arrays + RUSTLS_DEFAULT_VERSIONS or RUSTLS_ALL_VERSIONS can be used directly. + + `tls_versions` will only be used during the call and the application retains + ownership. `tls_versions_len` is the number of consecutive `uint16_t` + pointed to by `tls_versions`. + + Ciphersuites are configured separately via the crypto provider. See + `rustls_crypto_provider_builder_set_cipher_suites` for more information. + """ + return Result(_rustls.get_function[ + fn ( + UnsafePointer[CryptoProvider], + UnsafePointer[UInt16], + Int, + UnsafePointer[UnsafePointer[ClientConfigBuilder]], + ) -> UInt32 + ]("rustls_client_config_builder_new_custom")( + provider, tls_versions, tls_versions_len, builder_out + )) + + +fn client_config_builder_dangerous_set_certificate_verifier( + config_builder: UnsafePointer[ClientConfigBuilder], + callback: VerifyServerCertCallback, +) -> Result: + """ + Set a custom server certificate verifier using the builder crypto provider. + Returns rustls_result::NoDefaultCryptoProvider if no process default crypto + provider has been set, and the builder was not constructed with an explicit + provider choice. + + The callback must not capture any of the pointers in its + rustls_verify_server_cert_params. + If `userdata` has been set with rustls_connection_set_userdata, it + will be passed to the callback. Otherwise the userdata param passed to + the callback will be NULL. + + The callback must be safe to call on any thread at any time, including + multiple concurrent calls. So, for instance, if the callback mutates + userdata (or other shared state), it must use synchronization primitives + to make such mutation safe. + + The callback receives certificate chain information as raw bytes. + Currently this library offers no functions to parse the certificates, + so you'll need to bring your own certificate parsing library + if you need to parse them. + + If the custom verifier accepts the certificate, it should return + RUSTLS_RESULT_OK. Otherwise, it may return any other rustls_result error. + Feel free to use an appropriate error from the RUSTLS_RESULT_CERT_* + section. + + + """ + return Result(_rustls.get_function[ + fn ( + UnsafePointer[ClientConfigBuilder], + VerifyServerCertCallback, + ) -> UInt32 + ]("rustls_client_config_builder_dangerous_set_certificate_verifier")( + config_builder, callback + )) + + +fn client_config_builder_set_server_verifier( + builder: UnsafePointer[ClientConfigBuilder], + verifier: UnsafePointer[ServerCertVerifier], +): + """ + Configure the server certificate verifier. + + This increases the reference count of `verifier` and does not take ownership. + """ + _rustls.get_function[ + fn ( + UnsafePointer[ClientConfigBuilder], + UnsafePointer[ServerCertVerifier], + ) -> None + ]("rustls_client_config_builder_set_server_verifier")(builder, verifier) + + +fn client_config_builder_set_alpn_protocols( + builder: UnsafePointer[ClientConfigBuilder], + protocol: UnsafePointer[SliceBytes], + len: Int, +) -> Result: + """ + Set the ALPN protocol list to the given protocols. + + `protocols` must point to a buffer of `rustls_slice_bytes` (built by the caller) with `len` + elements. + + Each element of the buffer must be a rustls_slice_bytes whose + data field points to a single ALPN protocol ID. + + Standard ALPN protocol IDs are defined at + . + + This function makes a copy of the data in `protocols` and does not retain + any pointers, so the caller can free the pointed-to memory after calling. + + + """ + return Result(_rustls.get_function[ + fn ( + UnsafePointer[ClientConfigBuilder], + UnsafePointer[SliceBytes], + Int, + ) -> UInt32 + ]("rustls_client_config_builder_set_alpn_protocols")(builder, protocol, len)) + + +fn client_config_builder_set_enable_sni( + builder: UnsafePointer[ClientConfigBuilder], enable: Bool +): + """ + Enable or disable SNI. + + """ + _rustls.get_function[fn (UnsafePointer[ClientConfigBuilder], Bool) -> None]( + "rustls_client_config_builder_set_enable_sni" + )(builder, enable) + + +fn client_config_builder_set_certified_key( + builder: UnsafePointer[ClientConfigBuilder], + certified_keys: UnsafePointer[UnsafePointer[CertifiedKey]], + certified_keys_len: Int, +) -> Result: + """ + Provide the configuration a list of certificates where the connection + will select the first one that is compatible with the server's signature + verification capabilities. + + Clients that want to support both ECDSA and RSA certificates will want the + ECSDA to go first in the list. + + The built configuration will keep a reference to all certified keys + provided. The client may `rustls_certified_key_free()` afterwards + without the configuration losing them. The same certified key may also + be used in multiple configs. + + EXPERIMENTAL: installing a client authentication callback will replace any + configured certified keys and vice versa. + """ + return Result(_rustls.get_function[ + fn ( + UnsafePointer[ClientConfigBuilder], + UnsafePointer[UnsafePointer[CertifiedKey]], + Int, + ) -> UInt32 + ]("rustls_client_config_builder_set_certified_key")( + builder, certified_keys, certified_keys_len + )) + + +fn client_config_builder_build( + builder: UnsafePointer[ClientConfigBuilder], + config_out: UnsafePointer[UnsafePointer[ClientConfig]], +) -> Result: + """ + Turn a *rustls_client_config_builder (mutable) into a const *rustls_client_config + (read-only). + """ + return Result(_rustls.get_function[ + fn ( + UnsafePointer[ClientConfigBuilder], + UnsafePointer[UnsafePointer[ClientConfig]], + ) -> UInt32 + ]("rustls_client_config_builder_build")(builder, config_out)) + + +fn client_config_builder_free( + builder: UnsafePointer[ClientConfigBuilder], +): + """ + "Free" a client_config_builder without building it into a rustls_client_config. + + Normally builders are built into rustls_client_config via `rustls_client_config_builder_build` + and may not be free'd or otherwise used afterwards. + + Use free only when the building of a config has to be aborted before a config + was created. + """ + _rustls.get_function[fn (UnsafePointer[ClientConfigBuilder]) -> None]( + "rustls_client_config_builder_free" + )(builder) + + +fn client_config_free(config: UnsafePointer[ClientConfig]): + """ + "Free" a `rustls_client_config` previously returned from + `rustls_client_config_builder_build`. + + Since `rustls_client_config` is actually an atomically reference-counted pointer, + extant client connections may still hold an internal reference to the Rust object. + + However, C code must consider this pointer unusable after "free"ing it. + + Calling with NULL is fine. Must not be called twice with the same value. + """ + _rustls.get_function[fn (UnsafePointer[ClientConfig]) -> None]( + "rustls_client_config_free" + )(config) + + +fn client_connection_new( + config: UnsafePointer[ClientConfig], + server_name: UnsafePointer[Int8], + conn_out: UnsafePointer[UnsafePointer[Connection]], +) -> Result: + """ + Create a new rustls_connection containing a client connection and return + it in the output parameter `conn_out`. + + If this returns an error code, the memory pointed to by `conn_out` remains + unchanged. + + If this returns a non-error, the memory pointed to by `conn_out` + is modified to point at a valid `rustls_connection`. The caller now owns + the `rustls_connection` and must call `rustls_connection_free` when done with it. + + The server_name parameter can contain a hostname or an IP address in + textual form (IPv4 or IPv6). This function will return an error if it + cannot be parsed as one of those types. + """ + return _rustls.get_function[fn () -> Result]( + "rustls_client_connection_new" + )() + + +fn connection_set_userdata( + conn: UnsafePointer[Connection], userdata: UnsafePointer[NoneType] +): + """ + Set the userdata pointer associated with this connection. This will be passed + to any callbacks invoked by the connection, if you've set up callbacks in the config. + The pointed-to data must outlive the connection. + """ + _rustls.get_function[ + fn (UnsafePointer[Connection], UnsafePointer[NoneType]) -> None + ]("rustls_connection_set_userdata")(conn, userdata) + + +fn connection_set_log_callback( + conn: UnsafePointer[Connection], cb: LogCallback +): + """ + Set the logging callback for this connection. The log callback will be invoked + with the userdata parameter previously set by rustls_connection_set_userdata, or + NULL if no userdata was set. + """ + _rustls.get_function[fn (UnsafePointer[Connection], LogCallback) -> None]( + "rustls_connection_set_log_callback" + )(conn, cb) + + +fn connection_read_tls( + conn: UnsafePointer[Connection], + callback: ReadCallback, + userdata: UnsafePointer[NoneType], + out_n: UnsafePointer[Int], +) -> IoResult: + """ + Read some TLS bytes from the network into internal buffers. The actual network + I/O is performed by `callback`, which you provide. Rustls will invoke your + callback with a suitable buffer to store the read bytes into. You don't have + to fill it up, just fill with as many bytes as you get in one syscall. + The `userdata` parameter is passed through directly to `callback`. Note that + this is distinct from the `userdata` parameter set with + `rustls_connection_set_userdata`. + Returns 0 for success, or an errno value on error. Passes through return values + from callback. See rustls_read_callback for more details. + + """ + return _rustls.get_function[ + fn ( + UnsafePointer[Connection], + ReadCallback, + UnsafePointer[NoneType], + UnsafePointer[Int], + ) -> IoResult + ]("rustls_connection_read_tls")(conn, callback, userdata, out_n) + + +fn connection_write_tls( + conn: UnsafePointer[Connection], + callback: WriteCallback, + userdata: UnsafePointer[NoneType], + out_n: UnsafePointer[Int], +) -> IoResult: + """ + Write some TLS bytes to the network. The actual network I/O is performed by + `callback`, which you provide. Rustls will invoke your callback with a + suitable buffer containing TLS bytes to send. You don't have to write them + all, just as many as you can in one syscall. + The `userdata` parameter is passed through directly to `callback`. Note that + this is distinct from the `userdata` parameter set with + `rustls_connection_set_userdata`. + Returns 0 for success, or an errno value on error. Passes through return values + from callback. See rustls_write_callback for more details. + + """ + return _rustls.get_function[ + fn ( + UnsafePointer[Connection], + WriteCallback, + UnsafePointer[NoneType], + UnsafePointer[Int], + ) -> IoResult + ]("rustls_connection_write_tls")(conn, callback, userdata, out_n) + + +fn connection_write_tls_vectored( + conn: UnsafePointer[Connection], + callback: WriteVectoredCallback, + userdata: UnsafePointer[NoneType], + out_n: UnsafePointer[Int], +) -> IoResult: + """ + Write all available TLS bytes to the network. The actual network I/O is performed by + `callback`, which you provide. Rustls will invoke your callback with an array + of rustls_slice_bytes, each containing a buffer with TLS bytes to send. + You don't have to write them all, just as many as you are willing. + The `userdata` parameter is passed through directly to `callback`. Note that + this is distinct from the `userdata` parameter set with + `rustls_connection_set_userdata`. + Returns 0 for success, or an errno value on error. Passes through return values + from callback. See rustls_write_callback for more details. + + """ + return _rustls.get_function[ + fn ( + UnsafePointer[Connection], + WriteVectoredCallback, + UnsafePointer[NoneType], + UnsafePointer[Int], + ) -> IoResult + ]("rustls_connection_write_tls_vectored")(conn, callback, userdata, out_n) + + +fn connection_process_new_packets(conn: UnsafePointer[Connection]) -> Result: + """ + Decrypt any available ciphertext from the internal buffer and put it + into the internal plaintext buffer, potentially making bytes available + for rustls_connection_read(). + + """ + return _rustls.get_function[fn (UnsafePointer[Connection]) -> Result]( + "rustls_connection_process_new_packets" + )(conn) + + +fn connection_wants_read(conn: UnsafePointer[Connection]) -> Bool: + """ + """ + return _rustls.get_function[fn (UnsafePointer[Connection]) -> Bool]( + "rustls_connection_wants_read" + )(conn) + + +fn connection_wants_write(conn: UnsafePointer[Connection]) -> Bool: + """ + """ + return _rustls.get_function[fn (UnsafePointer[Connection]) -> Bool]( + "rustls_connection_wants_write" + )(conn) + + +fn connection_is_handshaking(conn: UnsafePointer[Connection]) -> Bool: + """ + Returns true if the connection is currently performing the TLS handshake. + + Note: This may return `false` while there are still handshake packets waiting + to be extracted and transmitted with `rustls_connection_write_tls()`. + + See the rustls documentation for more information. + + + """ + return _rustls.get_function[fn (UnsafePointer[Connection]) -> Bool]( + "rustls_connection_is_handshaking" + )(conn) + + +fn connection_set_buffer_limit(conn: UnsafePointer[Connection], n: Int): + """ + Sets a limit on the internal buffers used to buffer unsent plaintext (prior + to completing the TLS handshake) and unsent TLS records. By default, there + is no limit. The limit can be set at any time, even if the current buffer + use is higher. + + """ + _rustls.get_function[fn (UnsafePointer[Connection], Int) -> None]( + "rustls_connection_set_buffer_limit" + )(conn, n) + + +fn connection_send_close_notify(conn: UnsafePointer[Connection]): + """ + Queues a close_notify fatal alert to be sent in the next write_tls call. + + """ + _rustls.get_function[fn (UnsafePointer[Connection]) -> None]( + "rustls_connection_send_close_notify" + )(conn) + + +fn connection_get_peer_certificate( + conn: UnsafePointer[Connection], i: Int +) -> UnsafePointer[Certificate]: + """ + Return the i-th certificate provided by the peer. + Index 0 is the end entity certificate. Higher indexes are certificates + in the chain. Requesting an index higher than what is available returns + NULL. + The returned pointer is valid until the next mutating function call + affecting the connection. A mutating function call is one where the + first argument has type `struct rustls_connection *` (as opposed to + `const struct rustls_connection *`). + + """ + return _rustls.get_function[ + fn (UnsafePointer[Connection], Int) -> UnsafePointer[Certificate] + ]("rustls_connection_get_peer_certificate")(conn, i) + + +fn connection_get_alpn_protocol( + conn: UnsafePointer[Connection], + protocol_out: UnsafePointer[UnsafePointer[UInt8]], + protocol_out_len: UnsafePointer[Int], +): + """ + Get the ALPN protocol that was negotiated, if any. Stores a pointer to a + borrowed buffer of bytes, and that buffer's len, in the output parameters. + The borrow lives as long as the connection. + If the connection is still handshaking, or no ALPN protocol was negotiated, + stores NULL and 0 in the output parameters. + The provided pointer is valid until the next mutating function call + affecting the connection. A mutating function call is one where the + first argument has type `struct rustls_connection *` (as opposed to + `const struct rustls_connection *`). + + + """ + _rustls.get_function[ + fn ( + UnsafePointer[Connection], + UnsafePointer[UnsafePointer[UInt8]], + UnsafePointer[Int], + ) -> None + ]("rustls_connection_get_alpn_protocol")( + conn, protocol_out, protocol_out_len + ) + + +fn connection_get_protocol_version( + conn: UnsafePointer[Connection], +) -> UInt16: + """ + Return the TLS protocol version that has been negotiated. Before this + has been decided during the handshake, this will return 0. Otherwise, + the u16 version number as defined in the relevant RFC is returned. + + + """ + return _rustls.get_function[fn (UnsafePointer[Connection]) -> UInt16]( + "rustls_connection_get_protocol_version" + )(conn) + + +fn connection_get_negotiated_ciphersuite( + conn: UnsafePointer[Connection], +) -> UInt16: + """ + Retrieves the [IANA registered cipher suite identifier][IANA] agreed with the peer. + + This returns `TLS_NULL_WITH_NULL_NULL` (0x0000) until the ciphersuite is agreed. + + [IANA]: + """ + return _rustls.get_function[fn (UnsafePointer[Connection]) -> UInt16]( + "rustls_connection_get_negotiated_ciphersuite" + )(conn) + + +fn connection_get_negotiated_ciphersuite_name( + conn: UnsafePointer[Connection], +) -> StringRef: + """ + Retrieves the cipher suite name agreed with the peer. + + This returns "" until the ciphersuite is agreed. + + The lifetime of the `rustls_str` is the lifetime of the program, it does not + need to be freed. + + + """ + return _rustls.get_function[fn (UnsafePointer[Connection]) -> StringRef]( + "rustls_connection_get_negotiated_ciphersuite_name" + )(conn) + + +fn connection_write( + conn: UnsafePointer[Connection], + buf: UnsafePointer[UInt8], + count: Int, + out_n: UnsafePointer[Int], +) -> Result: + """ + Write up to `count` plaintext bytes from `buf` into the `rustls_connection`. + This will increase the number of output bytes available to + `rustls_connection_write_tls`. + On success, store the number of bytes actually written in *out_n + (this may be less than `count`). + + """ + return Result(_rustls.get_function[ + fn ( + UnsafePointer[Connection], + UnsafePointer[UInt8], + Int, + UnsafePointer[Int], + ) -> UInt32 + ]("rustls_connection_write")(conn, buf, count, out_n)) + + +fn connection_read( + conn: UnsafePointer[Connection], + buf: UnsafePointer[UInt8], + count: Int, + out_n: UnsafePointer[Int], +) -> Result: + """ + Read up to `count` plaintext bytes from the `rustls_connection` into `buf`. + On success, store the number of bytes read in *out_n (this may be less + than `count`). A success with *out_n set to 0 means "all bytes currently + available have been read, but more bytes may become available after + subsequent calls to rustls_connection_read_tls and + rustls_connection_process_new_packets." + + Subtle note: Even though this function only writes to `buf` and does not + read from it, the memory in `buf` must be initialized before the call (for + Rust-internal reasons). Initializing a buffer once and then using it + multiple times without zeroizing before each call is fine. + + """ + return Result(_rustls.get_function[ + fn ( + UnsafePointer[Connection], + UnsafePointer[UInt8], + Int, + UnsafePointer[Int], + ) -> UInt32 + ]("rustls_connection_read")(conn, buf, count, out_n)) + + +fn connection_free(conn: UnsafePointer[Connection]): + """ + Free a rustls_connection. Calling with NULL is fine. + Must not be called twice with the same value. + """ + _rustls.get_function[fn (UnsafePointer[Connection]) -> None]( + "rustls_connection_free" + )(conn) + + +fn crypto_provider_builder_new_from_default( + builder_out: UnsafePointer[UnsafePointer[CryptoProviderBuilder]], +) -> Result: + """ + Constructs a new `rustls_crypto_provider_builder` using the process-wide default crypto + provider as the base crypto provider to be customized. + + When this function returns `rustls_result::Ok` a pointer to the `rustls_crypto_provider_builder` + is written to `builder_out`. It returns `rustls_result::NoDefaultCryptoProvider` if no default + provider has been registered. + + The caller owns the returned `rustls_crypto_provider_builder` and must free it using + `rustls_crypto_provider_builder_free`. + + This function is typically used for customizing the default crypto provider for specific + connections. For example, a typical workflow might be to: + + * Either: + * Use the default `aws-lc-rs` or `*ring*` provider that rustls-ffi is built with based on + the `CRYPTO_PROVIDER` build variable. + * Call `rustls_crypto_provider_builder_new_with_base` with the desired provider, and + then install it as the process default with + `rustls_crypto_provider_builder_build_as_default`. + * Afterward, as required for customization: + * Use `rustls_crypto_provider_builder_new_from_default` to get a builder backed by the + default crypto provider. + * Use `rustls_crypto_provider_builder_set_cipher_suites` to customize the supported + ciphersuites. + * Use `rustls_crypto_provider_builder_build` to build a customized provider. + * Provide that customized provider to client or server configuration builders. + """ + res = _rustls.get_function[ + fn (UnsafePointer[UnsafePointer[CryptoProviderBuilder]]) -> UInt32 + ]("rustls_crypto_provider_builder_new_from_default")(builder_out) + return Result(res) + + +fn crypto_provider_builder_new_with_base( + base: UnsafePointer[CryptoProvider], +) -> UnsafePointer[CryptoProviderBuilder]: + """ + Constructs a new `rustls_crypto_provider_builder` using the given `rustls_crypto_provider` + as the base crypto provider to be customized. + + The caller owns the returned `rustls_crypto_provider_builder` and must free it using + `rustls_crypto_provider_builder_free`. + + This function can be used for setting the default process wide crypto provider, + or for constructing a custom crypto provider for a specific connection. A typical + workflow could be to: + + * Call `rustls_crypto_provider_builder_new_with_base` with a custom provider + * Install the custom provider as the process-wide default with + `rustls_crypto_provider_builder_build_as_default`. + + Or, for per-connection customization: + + * Call `rustls_crypto_provider_builder_new_with_base` with a custom provider + * Use `rustls_crypto_provider_builder_set_cipher_suites` to customize the supported + ciphersuites. + * Use `rustls_crypto_provider_builder_build` to build a customized provider. + * Provide that customized provider to client or server configuration builders. + """ + return _rustls.get_function[ + fn ( + UnsafePointer[CryptoProvider], + ) -> UnsafePointer[CryptoProviderBuilder] + ]("rustls_crypto_provider_builder_new_with_base")(base) + + +fn crypto_provider_builder_set_cipher_suites( + builder: UnsafePointer[CryptoProviderBuilder], + cipher_suites: UnsafePointer[UnsafePointer[SupportedCiphersuite]], + cipher_suites_len: Int, +) -> Result: + """ + Customize the supported ciphersuites of the `rustls_crypto_provider_builder`. + + Returns an error if the builder has already been built. Overwrites any previously + set ciphersuites. + """ + return Result(_rustls.get_function[ + fn ( + UnsafePointer[CryptoProviderBuilder], + UnsafePointer[UnsafePointer[SupportedCiphersuite]], + Int, + ) -> UInt32 + ]("rustls_crypto_provider_builder_set_cipher_suites")( + builder, cipher_suites, cipher_suites_len + )) + + +fn crypto_provider_builder_build( + builder: UnsafePointer[CryptoProviderBuilder], + provider_out: UnsafePointer[UnsafePointer[CryptoProvider]], +) -> Result: + """ + Builds a `rustls_crypto_provider` from the builder and returns it. Returns an error if the + builder has already been built. + + The `rustls_crypto_provider_builder` builder is consumed and should not be used + for further calls, except to `rustls_crypto_provider_builder_free`. The caller must + still free the builder after a successful build. + """ + return Result(_rustls.get_function[ + fn ( + UnsafePointer[CryptoProviderBuilder], + UnsafePointer[UnsafePointer[CryptoProvider]], + ) -> UInt32 + ]("rustls_crypto_provider_builder_build")(builder, provider_out)) + + +fn crypto_provider_builder_build_as_default( + builder: UnsafePointer[CryptoProviderBuilder], +) -> Result: + """ + Builds a `rustls_crypto_provider` from the builder and sets it as the + process-wide default crypto provider. + + Afterward, the default provider can be retrieved using `rustls_crypto_provider_default`. + + This can only be done once per process, and will return an error if a + default provider has already been set, or if the builder has already been built. + + The `rustls_crypto_provider_builder` builder is consumed and should not be used + for further calls, except to `rustls_crypto_provider_builder_free`. The caller must + still free the builder after a successful build. + """ + return Result(_rustls.get_function[ + fn (UnsafePointer[CryptoProviderBuilder]) -> UInt32 + ]("rustls_crypto_provider_builder_build_as_default")(builder)) + + +fn crypto_provider_builder_free( + builder: UnsafePointer[CryptoProviderBuilder], +): + """ + Free the `rustls_crypto_provider_builder`. + + Calling with `NULL` is fine. + Must not be called twice with the same value. + """ + _rustls.get_function[fn (UnsafePointer[CryptoProviderBuilder]) -> None]( + "rustls_crypto_provider_builder_free" + )(builder) + + +fn ring_crypto_provider() -> UnsafePointer[CryptoProvider]: + """ + Return the `rustls_crypto_provider` backed by the `*ring*` cryptography library. + + The caller owns the returned `rustls_crypto_provider` and must free it using + `rustls_crypto_provider_free`. + """ + return _rustls.get_function[fn () -> UnsafePointer[CryptoProvider]]( + "rustls_ring_crypto_provider" + )() + + +fn aws_lc_rs_crypto_provider() -> UnsafePointer[CryptoProvider]: + """ + Return the `rustls_crypto_provider` backed by the `aws-lc-rs` cryptography library. + + The caller owns the returned `rustls_crypto_provider` and must free it using + `rustls_crypto_provider_free`. + """ + return _rustls.get_function[fn () -> UnsafePointer[CryptoProvider]]( + "rustls_aws_lc_rs_crypto_provider" + )() + + +fn crypto_provider_default() -> UnsafePointer[CryptoProvider]: + """ + Retrieve a pointer to the process default `rustls_crypto_provider`. + + This may return `NULL` if no process default provider has been set using + `rustls_crypto_provider_builder_build_default`. + + Caller owns the returned `rustls_crypto_provider` and must free it w/ `rustls_crypto_provider_free`. + """ + return _rustls.get_function[fn () -> UnsafePointer[CryptoProvider]]( + "rustls_crypto_provider_default" + )() + + +fn crypto_provider_ciphersuites_len( + provider: UnsafePointer[CryptoProvider], +) -> Int: + """ + Returns the number of ciphersuites the `rustls_crypto_provider` supports. + + You can use this to know the maximum allowed index for use with + `rustls_crypto_provider_ciphersuites_get`. + + This function will return 0 if the `provider` is NULL. + """ + return _rustls.get_function[fn (UnsafePointer[CryptoProvider]) -> Int]( + "rustls_crypto_provider_ciphersuites_len" + )(provider) + + +fn crypto_provider_ciphersuites_get( + provider: UnsafePointer[CryptoProvider], index: Int +) -> UnsafePointer[SupportedCiphersuite]: + """ + Retrieve a pointer to a supported ciphersuite of the `rustls_crypto_provider`. + + This function will return NULL if the `provider` is NULL, or if the index is out of bounds + with respect to `rustls_crypto_provider_ciphersuites_len`. + + The lifetime of the returned `rustls_supported_ciphersuite` is equal to the lifetime of the + `provider` and should not be used after the `provider` is freed. + """ + return _rustls.get_function[ + fn ( + UnsafePointer[CryptoProvider], Int + ) -> UnsafePointer[SupportedCiphersuite] + ]("rustls_supported_ciphersuite")(provider, index) + + +fn crypto_provider_load_key( + provider: UnsafePointer[CryptoProvider], + private_key: UnsafePointer[UInt8], + private_key_len: Int, + signing_key_out: UnsafePointer[UnsafePointer[SigningKey]], +) -> Result: + """ + Load a private key from the provided PEM content using the crypto provider. + + `private_key` must point to a buffer of `private_key_len` bytes, containing + a PEM-encoded private key. The exact formats supported will differ based on + the crypto provider in use. The default providers support PKCS#1, PKCS#8 or + SEC1 formats. + + When this function returns `rustls_result::Ok` a pointer to a `rustls_signing_key` + is written to `signing_key_out`. The caller owns the returned `rustls_signing_key` + and must free it with `rustls_signing_key_free`. + """ + return Result(_rustls.get_function[ + fn ( + UnsafePointer[CryptoProvider], + UnsafePointer[UInt8], + Int, + UnsafePointer[UnsafePointer[SigningKey]], + ) -> UInt32 + ]("rustls_crypto_provider_load_key")( + provider, private_key, private_key_len, signing_key_out + )) + + +fn crypto_provider_random( + provider: UnsafePointer[CryptoProvider], + buff: UnsafePointer[UInt8], + len: Int, +) -> Result: + """ + Write `len` bytes of cryptographically secure random data to `buff` using the crypto provider. + + `buff` must point to a buffer of at least `len` bytes. The caller maintains ownership + of the buffer. + + Returns `RUSTLS_RESULT_OK` on success, or `RUSTLS_RESULT_GET_RANDOM_FAILED` on failure. + """ + return Result(_rustls.get_function[ + fn ( + UnsafePointer[CryptoProvider], + UnsafePointer[UInt8], + Int, + ) -> UInt32 + ]("rustls_crypto_provider_random")(provider, buff, len)) + + +fn crypto_provider_free(provider: UnsafePointer[CryptoProvider]): + """ + Frees the `rustls_crypto_provider`. + + Calling with `NULL` is fine. + Must not be called twice with the same value. + """ + _rustls.get_function[fn (UnsafePointer[CryptoProvider]) -> None]( + "rustls_crypto_provider_free" + )(provider) + + +fn default_crypto_provider_ciphersuites_len() -> Int: + """ + Returns the number of ciphersuites the default process-wide crypto provider supports. + + You can use this to know the maximum allowed index for use with + `rustls_default_crypto_provider_ciphersuites_get`. + + This function will return 0 if no process-wide default `rustls_crypto_provider` is available. + """ + return _rustls.get_function[fn () -> Int]( + "rustls_default_crypto_provider_ciphersuites_len" + )() + + +fn default_crypto_provider_ciphersuites_get( + index: Int, +) -> UnsafePointer[SupportedCiphersuite]: + """ + Retrieve a pointer to a supported ciphersuite of the default process-wide crypto provider. + + This function will return NULL if the `provider` is NULL, or if the index is out of bounds + with respect to `rustls_default_crypto_provider_ciphersuites_len`. + + The lifetime of the returned `rustls_supported_ciphersuite` is static, as the process-wide + default provider lives for as long as the process. + """ + return _rustls.get_function[ + fn (Int) -> UnsafePointer[SupportedCiphersuite] + ]("rustls_default_crypto_provider_ciphersuites_get")(index) + + +fn default_crypto_provider_random( + buff: UnsafePointer[UInt8], len: Int +) -> Result: + """ + Write `len` bytes of cryptographically secure random data to `buff` using the process-wide + default crypto provider. + + `buff` must point to a buffer of at least `len` bytes. The caller maintains ownership + of the buffer. + + Returns `RUSTLS_RESULT_OK` on success, and one of `RUSTLS_RESULT_NO_DEFAULT_CRYPTO_PROVIDER` + or `RUSTLS_RESULT_GET_RANDOM_FAILED` on failure. + """ + return _rustls.get_function[fn (UnsafePointer[UInt8], Int) -> Result]( + "rustls_default_crypto_provider_random" + )(buff, len) + + +fn signing_key_free(signing_key: UnsafePointer[SigningKey]): + """ + Frees the `rustls_signing_key`. This is safe to call with a `NULL` argument, but + must not be called twice with the same value. + """ + _rustls.get_function[fn (UnsafePointer[SigningKey]) -> None]( + "rustls_signing_key_free" + )(signing_key) + + +fn error( + result: UInt32, + buf: UnsafePointer[Int8], + len: Int, + out_n: UnsafePointer[Int], +): + """ + After a rustls function returns an error, you may call + this to get a pointer to a buffer containing a detailed error + message. + + The contents of the error buffer will be out_n bytes long, + UTF-8 encoded, and not NUL-terminated. + """ + _rustls.get_function[ + fn (UInt32, UnsafePointer[Int8], Int, UnsafePointer[Int]) -> None + ]("rustls_error")(result, buf, len, out_n) + + +fn result_is_cert_error(result: UInt32) -> Bool: + return _rustls.get_function[fn (UInt32) -> Bool]( + "rustls_result_is_cert_error" + )(result) + + +fn log_level_str(level: LogLevel) -> StringRef: + """ + Return a rustls_str containing the stringified version of a log level. + """ + return _rustls.get_function[fn (LogLevel) -> StringRef]( + "rustls_log_level_str" + )(level) + + +fn slice_slice_bytes_len(input: UnsafePointer[SliceSliceBytes]) -> Int: + """ + Return the length of the outer slice. If the input pointer is NULL, + returns 0. + """ + return _rustls.get_function[fn (UnsafePointer[SliceSliceBytes]) -> Int]( + "rustls_slice_slice_bytes_len" + )(input) + + +fn slice_slice_bytes_get( + input: UnsafePointer[SliceSliceBytes], n: Int +) -> SliceBytes: + """ + Retrieve the nth element from the input slice of slices. + + If the input pointer is NULL, or n is greater than the length + of the `rustls_slice_slice_bytes`, returns rustls_slice_bytes{NULL, 0}. + """ + return _rustls.get_function[ + fn (UnsafePointer[SliceSliceBytes], Int) -> SliceBytes + ]("rustls_slice_slice_bytes_get")(input, n) + + +fn slice_str_len(input: UnsafePointer[SliceStr]) -> Int: + """ + Return the length of the outer slice. + + If the input pointer is NULL, returns 0. + """ + return _rustls.get_function[fn (UnsafePointer[SliceStr]) -> Int]( + "rustls_slice_str_len" + )(input) + + +fn slice_str_get(input: UnsafePointer[SliceStr], n: Int) -> StringRef: + """ + Retrieve the nth element from the input slice of `&str`s. + + If the input pointer is NULL, or n is greater than the length of the + rustls_slice_str, returns rustls_str{NULL, 0}. + """ + return _rustls.get_function[fn (UnsafePointer[SliceStr], Int) -> StringRef]( + "rustls_slice_str_get" + )(input, n) + + +fn server_config_builder_new() -> UnsafePointer[ServerConfigBuilder]: + """ + Create a rustls_server_config_builder using the process default crypto provider. + + Caller owns the memory and must eventually call rustls_server_config_builder_build, + then free the resulting rustls_server_config. + + Alternatively, if an error occurs or, you don't wish to build a config, call + `rustls_server_config_builder_free` to free the builder directly. + + This uses the process default provider's values for the cipher suites and key exchange + groups, as well as safe defaults for protocol versions. + """ + return _rustls.get_function[fn () -> UnsafePointer[ServerConfigBuilder]]( + "rustls_server_config_builder_new" + )() + + +fn server_config_builder_new_custom( + provider: UnsafePointer[CryptoProvider], + versions: UnsafePointer[UInt16], + tls_versions_len: Int, + builder_out: UnsafePointer[UnsafePointer[ServerConfigBuilder]], +) -> Result: + """ + Create a rustls_server_config_builder using the specified crypto provider. + + Caller owns the memory and must eventually call rustls_server_config_builder_build, + then free the resulting rustls_server_config. + + Alternatively, if an error occurs or, you don't wish to build a config, call + `rustls_server_config_builder_free` to free the builder directly. + + `tls_versions` set the TLS protocol versions to use when negotiating a TLS session. + + `tls_versions` is the version of the protocol, as defined in rfc8446, + ch. 4.2.1 and end of ch. 5.1. Some values are defined in + `rustls_tls_version` for convenience. + + `tls_versions` will only be used during the call and the application retains + ownership. `tls_versions_len` is the number of consecutive `uint16_t` pointed + to by `tls_versions`. + + Ciphersuites are configured separately via the crypto provider. See + `rustls_crypto_provider_builder_set_cipher_suites` for more information. + """ + return Result(_rustls.get_function[ + fn ( + UnsafePointer[CryptoProvider], + UnsafePointer[UInt16], + Int, + UnsafePointer[UnsafePointer[ServerConfigBuilder]], + ) -> UInt32 + ]("rustls_server_config_builder_new_custom")( + provider, versions, tls_versions_len, builder_out + )) + + +fn server_config_builder_set_client_verifier( + builder: UnsafePointer[ServerConfigBuilder], + verifier: UnsafePointer[ClientCertVerifier], +): + """ + Create a rustls_server_config_builder for TLS sessions that may verify client + certificates. + + This increases the refcount of `verifier` and doesn't take ownership. + """ + _rustls.get_function[ + fn ( + UnsafePointer[ServerConfigBuilder], + UnsafePointer[ClientCertVerifier], + ) -> None + ]("rustls_server_config_builder_set_client_verifier")(builder, verifier) + + +fn server_config_builder_free( + config: UnsafePointer[ServerConfigBuilder], +): + """ + "Free" a server_config_builder without building it into a rustls_server_config. + + Normally builders are built into rustls_server_configs via `rustls_server_config_builder_build` + and may not be free'd or otherwise used afterwards. + + Use free only when the building of a config has to be aborted before a config + was created. + """ + return _rustls.get_function[ + fn (UnsafePointer[ServerConfigBuilder]) -> None + ]("rustls_server_config_builder_free")(config) + + +fn server_config_builder_set_ignore_client_order( + builder: UnsafePointer[ServerConfigBuilder], ignore: Bool +) -> Result: + """ + With `ignore` != 0, the server will ignore the client ordering of cipher + suites, aka preference, during handshake and respect its own ordering + as configured. + + """ + return Result(_rustls.get_function[ + fn (UnsafePointer[ServerConfigBuilder], Bool) -> UInt32 + ]("rustls_server_config_builder_set_ignore_client_order")(builder, ignore)) + + +fn server_config_builder_set_alpn_protocols( + builder: UnsafePointer[ServerConfigBuilder], + protocols: UnsafePointer[SliceBytes], + len: Int, +) -> Result: + """ + Set the ALPN protocol list to the given protocols. + + `protocols` must point to a buffer of `rustls_slice_bytes` (built by the caller) + with `len` elements. Each element of the buffer must point to a slice of bytes that + contains a single ALPN protocol from + . + + This function makes a copy of the data in `protocols` and does not retain + any pointers, so the caller can free the pointed-to memory after calling. + + + """ + return Result(_rustls.get_function[ + fn ( + UnsafePointer[ServerConfigBuilder], UnsafePointer[SliceBytes], Int + ) -> UInt32 + ]("rustls_server_config_builder_set_alpn_protocols")( + builder, protocols, len + )) + + +fn server_config_builder_set_certified_keys( + builder: UnsafePointer[ServerConfigBuilder], + certified_keys: UnsafePointer[UnsafePointer[CertifiedKey]], + certified_keys_len: Int, +) -> Result: + """ + Provide the configuration a list of certificates where the connection + will select the first one that is compatible with the client's signature + verification capabilities. + + Servers that want to support both ECDSA and RSA certificates will want + the ECSDA to go first in the list. + + The built configuration will keep a reference to all certified keys + provided. The client may `rustls_certified_key_free()` afterwards + without the configuration losing them. The same certified key may also + be used in multiple configs. + + EXPERIMENTAL: installing a client_hello callback will replace any + configured certified keys and vice versa. + """ + return Result(_rustls.get_function[ + fn ( + UnsafePointer[ServerConfigBuilder], + UnsafePointer[UnsafePointer[CertifiedKey]], + Int, + ) -> UInt32 + ]("rustls_server_config_builder_set_certified_keys")( + builder, certified_keys, certified_keys_len + )) + + +fn server_config_builder_build( + builder: UnsafePointer[ServerConfigBuilder], + config_out: UnsafePointer[UnsafePointer[ServerConfig]], +) -> Result: + """ + Turn a *rustls_server_config_builder (mutable) into a const *rustls_server_config + (read-only). The constructed `rustls_server_config` will be written to the `config_out` + pointer when this function returns `rustls_result::Ok`. + + This function may return an error if no process default crypto provider has been set + and the builder was constructed using `rustls_server_config_builder_new`, or if no + certificate resolver was set. + """ + return Result(_rustls.get_function[ + fn ( + UnsafePointer[ServerConfigBuilder], + UnsafePointer[UnsafePointer[ServerConfig]], + ) -> UInt32 + ]("rustls_server_config_builder_build")(builder, config_out)) + + +fn server_config_free(config: UnsafePointer[ServerConfig]): + """ + "Free" a rustls_server_config previously returned from + rustls_server_config_builder_build. + + Since rustls_server_config is actually an + atomically reference-counted pointer, extant server connections may still + hold an internal reference to the Rust object. However, C code must + consider this pointer unusable after "free"ing it. + Calling with NULL is fine. Must not be called twice with the same value. + """ + return _rustls.get_function[fn (UnsafePointer[ServerConfig]) -> None]( + "rustls_server_config_free" + )(config) + + +fn server_connection_new( + config: UnsafePointer[ServerConfig], + conn_out: UnsafePointer[UnsafePointer[Connection]], +) -> Result: + """ + Create a new rustls_connection containing a server connection, and return it. + + It is returned in the output parameter `conn_out`. + + If this returns an error code, the memory pointed to by `conn_out` remains unchanged. + + If this returns a non-error, the memory pointed to by `conn_out` is modified to point + at a valid rustls_connection + + The caller now owns the rustls_connection and must call `rustls_connection_free` when + done with it. + """ + return Result(_rustls.get_function[ + fn ( + UnsafePointer[ServerConfig], + UnsafePointer[UnsafePointer[Connection]], + ) -> UInt32 + ]("rustls_server_connection_new")(config, conn_out)) + + +fn server_connection_get_server_name( + conn: UnsafePointer[Connection], + buf: UnsafePointer[UInt8], + count: Int, + out_n: UnsafePointer[Int], +) -> Result: + """ + Copy the server name from the server name indication (SNI) extension to `buf`. + + `buf` can hold up to `count` bytes, and the length of that server name in `out_n`. + + The string is stored in UTF-8 with no terminating NUL byte. + + Returns RUSTLS_RESULT_INSUFFICIENT_SIZE if the SNI hostname is longer than `count`. + + Returns Ok with *out_n == 0 if there is no SNI hostname available on this connection + because it hasn't been processed yet, or because the client did not send SNI. + + """ + return Result(_rustls.get_function[ + fn ( + UnsafePointer[Connection], + UnsafePointer[UInt8], + Int, + UnsafePointer[Int], + ) -> UInt32 + ]("rustls_server_connection_get_server_name")(conn, buf, count, out_n)) + + +fn server_config_builder_set_hello_callback( + builder: UnsafePointer[ServerConfigBuilder], callback: ClientHelloCallback +) -> Result: + """ + Register a callback to be invoked when a connection created from this config + sees a TLS ClientHello message. If `userdata` has been set with + rustls_connection_set_userdata, it will be passed to the callback. + Otherwise the userdata param passed to the callback will be NULL. + + Any existing `ResolvesServerCert` implementation currently installed in the + `rustls_server_config` will be replaced. This also means registering twice + will overwrite the first registration. It is not permitted to pass a NULL + value for `callback`. + + EXPERIMENTAL: this feature of rustls-ffi is likely to change in the future, as + the rustls library is re-evaluating their current approach to client hello handling. + Installing a client_hello callback will replace any configured certified keys + and vice versa. Same holds true for the set_certified_keys variant. + """ + return Result(_rustls.get_function[ + fn (UnsafePointer[ServerConfigBuilder], ClientHelloCallback) -> UInt32 + ]("rustls_server_config_builder_set_hello_callback")(builder, callback)) + + +fn client_hello_select_certified_key( + hello: UnsafePointer[ClientHello], + certified_keys: UnsafePointer[UnsafePointer[CertifiedKey]], + certified_keys_len: Int, + out_key: UnsafePointer[UnsafePointer[CertifiedKey]], +) -> Result: + """ + Select a `rustls_certified_key` from the list that matches the cryptographic + parameters of a TLS client hello. + + Note that this does not do any SNI matching. The input certificates should + already have been filtered to ones matching the SNI from the client hello. + + This is intended for servers that are configured with several keys for the + same domain name(s), for example ECDSA and RSA types. The presented keys are + inspected in the order given and keys first in the list are given preference, + all else being equal. However rustls is free to choose whichever it considers + to be the best key with its knowledge about security issues and possible future + extensions of the protocol. + + Return RUSTLS_RESULT_OK if a key was selected and RUSTLS_RESULT_NOT_FOUND + if none was suitable. + """ + return Result(_rustls.get_function[ + fn ( + UnsafePointer[ClientHello], + UnsafePointer[UnsafePointer[CertifiedKey]], + Int, + UnsafePointer[UnsafePointer[CertifiedKey]], + ) -> UInt32 + ]("rustls_client_hello_select_certified_key")( + hello, certified_keys, certified_keys_len, out_key + )) + + +fn server_config_builder_set_persistence( + builder: UnsafePointer[ServerConfigBuilder], + get_cb: SessionStoreGetCallback, + put_cb: SessionStorePutCallback, +) -> Result: + """ + Register callbacks for persistence of TLS session IDs and secrets. Both + keys and values are highly sensitive data, containing enough information + to break the security of the connections involved. + + If `userdata` has been set with rustls_connection_set_userdata, it + will be passed to the callbacks. Otherwise the userdata param passed to + the callbacks will be NULL. + """ + return Result(_rustls.get_function[ + fn ( + UnsafePointer[ServerConfigBuilder], + SessionStoreGetCallback, + SessionStorePutCallback, + ) -> UInt32 + ]("rustls_server_config_builder_set_persistence")(builder, get_cb, put_cb)) diff --git a/src/test.mojo b/src/test.mojo new file mode 100644 index 0000000..9fa5ea3 --- /dev/null +++ b/src/test.mojo @@ -0,0 +1,359 @@ +import rustls as rls +import os +from utils import StringSlice +from collections import Optional, InlineArray +from memory import Span, ArcPointer +from utilss import logger +from libc import socket, AF_INET, SOCK_STREAM, send, atol +# from lightbug_http.net import create_connection + +alias DEMO_OK = 0 +alias DEMO_AGAIN = 1 +alias DEMO_EOF = 2 +alias DEMO_ERROR = 3 + + +@value +struct ConnData: + var fd: Int + var verify_arg: String + var data: List[UInt8] + + +fn do_request( + client_config: rls.ClientConfig, + host: String, + port: String, + path: String, +) raises: + logger.info("establish TCP connection") + var fd = socket(AF_INET, SOCK_STREAM, 0) + if fd < 0: + raise Error("Failed to create socket") + + # Create the TCP connection + # var connection = create_connection(fd, host, atol(port)) + # if connection < 0: + # raise Error("Failed to create connection") + + # Now create the TLS connection with the established TCP socket + var conn = rls.ClientConnection(client_config, host) + logger.info("TLS connection created successfully") + + # Set the underlying TCP socket + # conn.set_socket(fd) + + # # Perform TLS handshake + # try: + # conn.do_handshake() + # except: + # raise Error("TLS handshake failed") + + # # Now you can send your request + # send_request_and_read_response(conn, host, path) + + +fn log_cb(level: Int, message: StringSlice): + print("Log level:", level, "Message:", message) + + +fn send_request_and_read_response( + # conn: ConnData, + conn: rls.ClientConnection, + hostname: String, + path: String, +) raises: + # var sockfd = conn.fd + + # var ret: RustlsResult = 1 + # var result: UInt32 = 1 + # var n: Int = 0 + # var headers_len: Int = 0 + # var content_length: Int = 0 + # var response_complete = False + + headers = ( + "GET " + + path + + " HTTP/1.1\r\n" + + "Host: " + + hostname + + "\r\n" + + "User-Agent: Mojo\r\n" + + "Accept: carcinization/inevitable, text/html\r\n" + + "Connection: close\r\n" + + "\r\n" + ) + + header_bytes = headers.as_bytes() + + # Write plaintext to rustls connection + + +# result = rustls_connection_write( +# rustls_connection, buf.data, len(headers), UnsafePointer.address_of(n) +# ) +# if result != 7000: +# print("Error writing plaintext bytes to rustls_connection") +# return ret +# if n != len(headers): +# print("Short write writing plaintext bytes to rustls_connection") +# return ret + +# var ciphersuite_name = rustls_connection_get_negotiated_ciphersuite_name( +# rustls_connection +# ) +# print("Negotiated ciphersuite: ", ciphersuite_name) + +# var read_fds = fd_set() +# var write_fds = fd_set() + +# while True: +# read_fds.clear_all() +# write_fds.clear_all() + +# if rustls_connection_wants_read(rustls_connection): +# print("Rustls wants read") +# read_fds.set(sockfd) +# if rustls_connection_wants_write(rustls_connection): +# print("Rustls wants write") +# write_fds.set(sockfd) + +# if not rustls_connection_wants_read( +# rustls_connection +# ) and not rustls_connection_wants_write(rustls_connection): +# print( +# "Rustls wants neither read nor write. Drain plaintext and exit" +# ) +# break + +# var select_result = select( +# sockfd + 1, +# UnsafePointer.address_of(read_fds), +# UnsafePointer.address_of(write_fds), +# UnsafePointer[fd_set](), +# UnsafePointer[timeval](), +# ) + +# if select_result == -1: +# print("Select error: ", select_result) +# return ret +# print("Select result:", select_result) +# print("Read fd set:", read_fds.is_set(sockfd)) +# print("Write fd set:", write_fds.is_set(sockfd)) + +# var counter = 0 + +# if write_fds.is_set(sockfd): +# while True: +# var conn_ptr = UnsafePointer[ConnData].address_of(conn) +# counter += 1 +# var write_result = rustls_connection_write_tls( +# rustls_connection, write_cb, conn_ptr, n +# ) +# if write_result != 7000: +# print( +# "Error in rustls_connection_write_tls: ", write_result +# ) +# return ret +# if write_result == DEMO_AGAIN: +# break +# elif n == 0: +# print("Write returned 0 from rustls_connection_write_tls") +# break +# if counter > 2: +# print("Counter exceeded 10") +# break + +# if read_fds.is_set(sockfd) or True: +# while True: +# print("Reading from socket") +# var read_result = do_read(conn, rustls_connection) +# if read_result == DEMO_AGAIN: +# break +# elif read_result == DEMO_EOF: +# response_complete = True +# break +# elif read_result != DEMO_OK: +# return ret + +# if headers_len == 0: +# var body_start = String(conn.data.data[]).find("\r\n\r\n") +# if body_start != -1: +# headers_len = body_start +# print("Body began at ", headers_len) +# var content_length_str = String(conn.data.data[]).find( +# "Content-Length: " +# ) +# if content_length_str == -1: +# print("Content length header not found") +# return ret +# content_length = int( +# String(conn.data.data[])[content_length_str + 16 :] +# ) +# print("Content length ", content_length) + +# if ( +# headers_len != 0 +# and conn.data.len >= headers_len + content_length +# ): +# response_complete = True +# break + +# if response_complete: +# break + +# return 7000 + + +# fn write_cb( +# userdata: UnsafePointer[UInt8], +# buf: UnsafePointer[UInt8], +# len: Int, +# out_n: UnsafePointer[Int], +# ) -> Int: +# var conn = userdata.bitcast[ConnData]()[] +# print("Writing to socket, length:", len) +# print("Record type:", buf[0]) +# print("TLS version:", buf[1], buf[2]) +# print("Length:", (buf[3].__int__() << 8) | buf[4].__int__()) +# if len > 5: +# print("Handshake type:", buf[5]) +# print("Full data:", buf) +# var buf_str = buf[].__str__() +# print("Writing to socket: ", buf_str) +# var signed_n = send(conn.fd, buf_str.unsafe_ptr(), len, 0) +# # var signed_n = send(conn.fd, buf, len, 0) +# if signed_n < 0: +# print("Error writing to socket, signed_n:", signed_n) +# return 0 +# out_n[0] = signed_n +# return 7000 + + +# fn read_cb( +# userdata: UnsafePointer[UInt8], +# buf: UnsafePointer[UInt8], +# len: Int, +# out_n: UnsafePointer[Int], +# ) -> Int: +# print("we are in read_cb") +# var conn = userdata.bitcast[ConnData]()[] +# print("Reading from socket") +# var signed_n = read(conn.fd, buf, len) +# print("signed_n", signed_n) +# for i in range(signed_n): +# print(chr(int(buf[i])), end="") +# print() +# if signed_n < 0: +# out_n[0] = 0 +# print("Error reading from socket") +# out_n[0] = signed_n.__int__() +# return 0 + + +# fn do_read(conn: ConnData, rconn: UnsafePointer[Connection]) raises -> Int: +# """ +# Do one read from the socket, process all resulting bytes into the +# rustls_connection, then copy all plaintext bytes from the session to stdout. +# Returns: +# - DEMO_OK for success +# - DEMO_AGAIN if we got an EAGAIN or EWOULDBLOCK reading from the socket +# - DEMO_EOF if we got EOF +# - DEMO_ERROR for other errors. +# """ +# var err: Int = 1 +# var result: UInt32 = 1 +# var n: Int = 0 +# var n_ptr = UnsafePointer.address_of(n) + +# print("going into rustls_connection_read_tls") +# err = rustls_connection_read_tls( +# rconn, read_cb, UnsafePointer.address_of(conn).bitcast[UInt8](), n_ptr +# ) +# _ = n +# print("coming out of rustls_connection_read_tls") +# # if err == EAGAIN or err == EWOULDBLOCK: +# # print("Reading from socket: EAGAIN or EWOULDBLOCK: ", err) +# # return DEMO_AGAIN +# # elif err != 0: +# # print("Reading from socket: err ", err) +# # return DEMO_ERROR + +# result = rustls_connection_process_new_packets(rconn) +# if result != 7000: +# print_error("in process_new_packets", result) +# return DEMO_ERROR + +# # If we got an EOF on the plaintext stream (peer closed connection cleanly), +# # verify that the sender then closed the TCP connection. +# var buf = SliceBytes(UnsafePointer[UInt8](), 1) +# var signed_n = read(conn.fd, buf.data, 1) + +# if signed_n > 0: +# print( +# "Error: read returned ", +# signed_n, +# " bytes after receiving close_notify", +# ) +# return DEMO_ERROR +# elif signed_n < 0: +# print("Wrong error after receiving close_notify: ", signed_n) +# return DEMO_ERROR + +# return DEMO_EOF + + +fn default_provider_with_custom_ciphersuite( + custom_ciphersuite_name: StringSlice, +) raises -> rls.CryptoProvider: + custom_ciphersuite = Optional[rls.SupportedCiphersuite]() + for suite in rls.default_crypto_provider_ciphersuites(): + if not suite: + raise Error("failed to get ciphersuite") + if suite.get_name() == custom_ciphersuite_name: + custom_ciphersuite = suite + + if not custom_ciphersuite: + raise Error( + "failed to select custom ciphersuite: " + + str(custom_ciphersuite_name) + ) + + provider_builder = rls.CryptoProviderBuilder() + providers = List(custom_ciphersuite.value()) + provider_builder.set_cipher_suites(providers) + + return provider_builder^.build() + + +fn main() raises: + var cert_path = "/etc/ssl/cert.pem" + if not os.setenv("CA_FILE", cert_path): + raise Error("Failed to set CA_FILE environment variable") + logger.info("Setting up default provider") + custom_provider = default_provider_with_custom_ciphersuite( + "TLS13_CHACHA20_POLY1305_SHA256" + ) + tls_versions = List[UInt16](0x0303, 0x0304) + logger.info("Setting up config builder") + config_builder = rls.ClientConfigBuilder(custom_provider, tls_versions) + logger.info("Setting up root cert store builder") + server_cert_root_store_builder = rls.RootCertStoreBuilder() + server_cert_root_store_builder.load_roots_from_file(cert_path) + server_root_cert_store = server_cert_root_store_builder^.build() + logger.info("root cert store built successfully") + server_cert_verifier_builder = rls.WebPkiServerCertVerifierBuilder( + server_root_cert_store + ) + server_cert_verifier = server_cert_verifier_builder^.build() + logger.info("server cert verifier built successfully") + config_builder.set_server_verifier(server_cert_verifier) + alpn = List[Span[UInt8, StaticConstantOrigin]]("http/1.1".as_bytes()) + config_builder.set_alpn_protocols(alpn) + client_config = config_builder^.build() + logger.info("client config built successfully") + host = "www.google.com" + port = "443" + path = "/" + result = do_request(client_config, host, port, path) diff --git a/src/utilss.mojo b/src/utilss.mojo new file mode 100644 index 0000000..f2a60c8 --- /dev/null +++ b/src/utilss.mojo @@ -0,0 +1,178 @@ +from lightbug_http.io.bytes import Bytes, Byte +from lightbug_http.strings import BytesConstant +from lightbug_http.net import default_buffer_size +from memory import memcpy + + +@always_inline +fn is_newline(b: Byte) -> Bool: + return b == BytesConstant.nChar or b == BytesConstant.rChar + + +@always_inline +fn is_space(b: Byte) -> Bool: + return b == BytesConstant.whitespace + + +struct ByteWriter: + var _inner: Bytes + + fn __init__(out self): + self._inner = Bytes(capacity=default_buffer_size) + + @always_inline + fn write(mut self, owned b: Bytes): + self._inner.extend(b^) + + @always_inline + fn write(mut self, mut s: String): + # kind of cursed but seems to work? + _ = s._buffer.pop() + self._inner.extend(s._buffer^) + s._buffer = s._buffer_type() + + @always_inline + fn write(mut self, s: StringLiteral): + var str = String(s) + self.write(str) + + @always_inline + fn write(mut self, b: Byte): + self._inner.append(b) + + fn consume(mut self) -> Bytes: + var ret = self._inner^ + self._inner = Bytes() + return ret^ + + +struct ByteReader: + var _inner: Bytes + var read_pos: Int + + fn __init__(out self, owned b: Bytes): + self._inner = b^ + self.read_pos = 0 + + fn peek(self) -> Byte: + if self.read_pos >= len(self._inner): + return 0 + return self._inner[self.read_pos] + + fn read_until(mut self, char: Byte) -> Bytes: + var start = self.read_pos + while self.peek() != char: + self.increment() + logger.info("start", start, "read_pos", self.read_pos, len(self._inner)) + logger.info(chr(int(self._inner[0])), chr(int(self._inner[1])), chr(int(self._inner[2])), chr(int(self._inner[3]))) + logger.info(self._inner[start : self.read_pos].__str__()) + return self._inner[start : self.read_pos] + + @always_inline + fn read_word(mut self) -> Bytes: + return self.read_until(BytesConstant.whitespace) + + fn read_line(mut self) -> Bytes: + var start = self.read_pos + while not is_newline(self.peek()): + self.increment() + var ret = self._inner[start : self.read_pos] + if self.peek() == BytesConstant.rChar: + self.increment(2) + else: + self.increment() + return ret + + @always_inline + fn skip_whitespace(mut self): + while is_space(self.peek()): + self.increment() + + @always_inline + fn skip_newlines(mut self): + while self.peek() == BytesConstant.rChar: + self.increment(2) + + @always_inline + fn increment(mut self, v: Int = 1): + self.read_pos += v + + @always_inline + fn consume(mut self, mut buffer: Bytes, bytes_len: Int = -1): + var pos = self.read_pos + var read_len: Int + if bytes_len == -1: + self.read_pos = -1 + read_len = len(self._inner) - pos + else: + self.read_pos += bytes_len + read_len = bytes_len + + buffer.resize(read_len, 0) + memcpy(buffer.data, self._inner.data + pos, read_len) + + +struct LogLevel(): + alias FATAL = 0 + alias ERROR = 1 + alias WARN = 2 + alias INFO = 3 + alias DEBUG = 4 + + +@value +struct Logger(): + var level: Int + + fn __init__(out self, level: Int = LogLevel.INFO): + self.level = level + + fn _log_message(self, message: String, level: Int): + if self.level >= level: + if level < LogLevel.WARN: + print(message, file=2) + else: + print(message) + + fn info[*Ts: Writable](self, *messages: *Ts): + var msg = String.write("\033[36mINFO\033[0m - ") + @parameter + fn write_message[T: Writable](message: T): + msg.write(message, " ") + messages.each[write_message]() + self._log_message(msg, LogLevel.INFO) + + fn warn[*Ts: Writable](self, *messages: *Ts): + var msg = String.write("\033[33mWARN\033[0m - ") + @parameter + fn write_message[T: Writable](message: T): + msg.write(message, " ") + messages.each[write_message]() + self._log_message(msg, LogLevel.WARN) + + fn error[*Ts: Writable](self, *messages: *Ts): + var msg = String.write("\033[31mERROR\033[0m - ") + @parameter + fn write_message[T: Writable](message: T): + msg.write(message, " ") + messages.each[write_message]() + self._log_message(msg, LogLevel.ERROR) + + fn debug[*Ts: Writable](self, *messages: *Ts): + var msg = String.write("\033[34mDEBUG\033[0m - ") + @parameter + fn write_message[T: Writable](message: T): + msg.write(message, " ") + messages.each[write_message]() + self._log_message(msg, LogLevel.DEBUG) + + fn fatal[*Ts: Writable](self, *messages: *Ts): + var msg = String.write("\033[35mFATAL\033[0m - ") + @parameter + fn write_message[T: Writable](message: T): + msg.write(message, " ") + messages.each[write_message]() + self._log_message(msg, LogLevel.FATAL) + + +alias logger = Logger() \ No newline at end of file