day-part-zeroconf 0.1.0

Native DNS-SD discovery and advertisement for Day apps
Documentation
name: ci
on:
  push:
    branches: ['**']
    tags: ['v[0-9]+.[0-9]+.[0-9]+*']
  pull_request:
  workflow_dispatch:
    inputs:
      day-main:
        description: Build against day's main branch instead of the newest release
        type: boolean
        default: false
  schedule:
    - cron: '25 6 * * *'
permissions:
  contents: read
jobs:
  host:
    timeout-minutes: 20
    env:
      DAY_ZEROCONF_TRACE: '1'
    strategy:
      fail-fast: false
      matrix:
        os: [ubuntu-latest, macos-15, windows-latest]
    runs-on: ${{ matrix.os }}
    steps:
      - uses: actions/checkout@v7
      - uses: dtolnay/rust-toolchain@stable
        with:
          components: rustfmt, clippy
      # Day from crates.io, or from main on a push (daybrite/actions day-deps).
      - uses: daybrite/actions/.github/actions/day-deps@v1
        with:
          day-deps: ${{ inputs.day-main && 'main' || 'auto' }}
      - if: runner.os == 'Linux'
        run: |
          sudo apt-get update
          sudo apt-get install -y avahi-daemon libavahi-client3 dbus
          sudo systemctl start avahi-daemon
      - if: runner.os == 'Windows'
        shell: pwsh
        run: |
          New-NetFirewallRule -DisplayName DayZeroconfMDNS -Direction Inbound -Protocol UDP -LocalPort 5353 -Action Allow
          New-NetFirewallRule -DisplayName DayZeroconfTCP -Direction Inbound -Protocol TCP -Action Allow
      - run: cargo fmt --all -- --check
      - run: cargo clippy --all-targets -- -D warnings
      - run: cargo test
      - name: Native advertisement, discovery, connection, withdrawal and cancellation
        run: cargo test --test native -- --ignored --test-threads=1 --nocapture
      - name: Legacy-unicast enumeration query
        # The hosted macOS VM timed out waiting for a multicast reply. Its multicast
        # routing/permission state is not a prerequisite for testing the UDP transport.
        # All hosts still exercise the real UDP receive loop over loopback in cargo test.
        # Windows' native responder does not publish the meta-enumeration record.
        if: runner.os == 'Linux'
        run: cargo test --lib enumerate::tests::native_legacy_query -- --ignored
      - run: cargo fmt --all -- --check
        working-directory: demo
      - run: cargo clippy --all-targets -- -D warnings
        working-directory: demo
      - run: cargo test
        working-directory: demo
  cross-check:
    timeout-minutes: 20
    strategy:
      fail-fast: false
      matrix:
        include:
          - { os: macos-15, target: aarch64-apple-ios-sim }
          - { os: ubuntu-latest, target: aarch64-linux-android }
          - { os: ubuntu-latest, target: aarch64-unknown-linux-ohos }
          - { os: ubuntu-latest, target: wasm32-unknown-unknown }
    runs-on: ${{ matrix.os }}
    steps:
      - uses: actions/checkout@v7
      - uses: dtolnay/rust-toolchain@stable
        with:
          targets: ${{ matrix.target }}
          components: clippy
      # Day from crates.io, or from main on a push (daybrite/actions day-deps).
      - uses: daybrite/actions/.github/actions/day-deps@v1
        with:
          day-deps: ${{ inputs.day-main && 'main' || 'auto' }}
      - run: cargo clippy --target ${{ matrix.target }} -- -D warnings
  demo:
    uses: daybrite/actions/.github/workflows/dayapp.yml@v1
    permissions:
      contents: write # Shared workflow uses this only for release assets on a tag.
      id-token: write # crates.io Trusted Publishing (publish-crates)
    secrets: inherit
    with:
      project-path: demo
      targets: macos-appkit, linux-gtk, linux-qt, windows-winui, ios-uikit, android-material, harmony-arkui
      day-deps: ${{ inputs.day-main && 'main' || 'auto' }}
      # On a version tag, after every leg passed: the library crates to crates.io.
      publish-crates: true
      launch-env: DAY_ZEROCONF_TRACE=1
      script-setup: source ../ci/demo-setup.sh
      scripts: dayscript/demo.yaml dayscript/presentation.yaml
      target-scripts: |
        macos-appkit, linux-gtk, linux-qt, android-material: dayscript/demo.yaml dayscript/enumeration.yaml dayscript/presentation.yaml
      preflight-checks: fmt, clippy, test
      target-packages: |
        linux-gtk, linux-qt: avahi-daemon libavahi-client3 dbus
      target-setup: |
        linux-gtk, linux-qt: sudo systemctl start avahi-daemon
        windows-winui: powershell -NoProfile -Command "New-NetFirewallRule -DisplayName DayZeroconfMDNS -Direction Inbound -Protocol UDP -LocalPort 5353 -Action Allow; New-NetFirewallRule -DisplayName DayZeroconfTCP -Direction Inbound -Protocol TCP -Action Allow"
      ios-devices: |
        device=iPhone, orientation=portrait
      android-devices: |
        device=pixel_7, os=36, orientation=portrait